diff --git a/src/runtime/logging.rs b/src/runtime/logging.rs new file mode 100644 index 0000000000000000000000000000000000000000..8d55670c7b96d21fbb5b9c127d51594dbd7f5a60 --- /dev/null +++ b/src/runtime/logging.rs @@ -0,0 +1,56 @@ +use super::*; + +impl FileLogger { + pub fn new(connector_id: ConnectorId, file: std::fs::File) -> Self { + Self(connector_id, file) + } +} +impl VecLogger { + pub fn new(connector_id: ConnectorId) -> Self { + Self(connector_id, Default::default()) + } +} +///////////////// +impl Logger for DummyLogger { + fn line_writer(&mut self) -> &mut dyn std::io::Write { + self + } +} +impl Logger for VecLogger { + fn line_writer(&mut self) -> &mut dyn std::io::Write { + let _ = write!(&mut self.1, "CID({}): ", self.0); + self + } +} +impl Logger for FileLogger { + fn line_writer(&mut self) -> &mut dyn std::io::Write { + let _ = write!(&mut self.1, "CID({}): ", self.0); + &mut self.1 + } +} +/////////////////// +impl Drop for VecLogger { + fn drop(&mut self) { + let stdout = std::io::stderr(); + let mut lock = stdout.lock(); + writeln!(lock, "--- DROP LOG DUMP ---").unwrap(); + let _ = std::io::Write::write(&mut lock, self.1.as_slice()); + } +} +impl std::io::Write for VecLogger { + fn flush(&mut self) -> Result<(), std::io::Error> { + Ok(()) + } + fn write(&mut self, data: &[u8]) -> Result { + self.1.extend_from_slice(data); + Ok(data.len()) + } +} +impl std::io::Write for DummyLogger { + fn flush(&mut self) -> Result<(), std::io::Error> { + Ok(()) + } + fn write(&mut self, bytes: &[u8]) -> Result { + Ok(bytes.len()) + } +}