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}