diary_cli/
scribe.rs

1use std::{io::{BufWriter, Write}, fs::File, path::Path};
2use soulog::*;
3
4pub struct Scribe<T: Logger>(BufWriter<File>, T);
5
6impl<T: Logger> Scribe<T> {
7    pub fn new(path: impl AsRef<Path>, mut logger: T) -> Self {
8        let file = if_err!((logger) [Scribe, err => ("While creating text file: {err:?}")] retry File::create(&path));
9        let buffer = BufWriter::new(file);
10        Self(buffer, logger)
11    }
12
13    #[inline]
14    pub fn write_line(&mut self, line: &str) {
15        self.write(line);
16        self.new_line();
17    }
18
19    pub fn write(&mut self, text: &str) {
20        let mut logger = self.1.hollow();
21        if_err!((logger) [Scribe, err => ("While writing to text file: {err:?}")] retry self.0.write_all(text.as_bytes()));
22    }
23
24    #[inline]
25    pub fn new_line(&mut self) {
26        let mut logger = self.1.hollow();
27        if_err!((logger) [Scribe, err => ("While writing to text file: {err:?}")] retry self.0.write_all("\n".as_bytes()));
28    }
29
30    pub fn flush(&mut self) {
31        let logger = &mut self.1;
32        if_err!((logger) [Sribe, err => ("While writing to text file: {err:?}")] retry self.0.flush());
33    }
34
35    #[inline]
36    pub fn finish(mut self) { self.flush() }
37}
38
39impl<T: Logger> Drop for Scribe<T> {
40    #[inline]
41    fn drop(&mut self) { self.flush() }
42}
43
44#[macro_export]
45macro_rules! scribe_write {
46    (($scribe:ident) $($text:expr),* $(,)?) => {{
47        $($scribe.write($text);)*
48    }}
49}