1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use crate::*;
use std::fmt::Write;


pub trait Formatter: Send + Sync + 'static {
  fn for_write(ctx: &Context) -> String;
  fn for_print(ctx: &Context) -> String;
}


#[derive(Debug, Clone, Copy)]
pub struct DefaultFormatter;


impl Formatter for DefaultFormatter {
  fn for_write(ctx: &Context) -> String {
    let mut string = String::new();

    match ctx {
      Context::Header { time, location, .. } => {
        time.for_write(&mut string);
        write!(string, "     ").unwrap();
        location.for_write(&mut string);
        write!(string, " - Session Start").unwrap();
      }

      Context::Footer { time, location, .. } => {
        time.for_write(&mut string);
        write!(string, "     ").unwrap();
        location.for_write(&mut string);
        write!(string, " - Session End").unwrap();
      }

      Context::Message { time, source, location, level, message, .. } => {
        time.for_write(&mut string);
        write!(string, " ").unwrap();
        level.for_write(&mut string);
        write!(string, " ").unwrap();

        if source.is_from_logger() {
          source.for_write(&mut string);
          write!(string, " - ").unwrap();
        }

        location.for_write(&mut string);
        write!(string, " - {message}").unwrap();
      }
    }

    string
  }

  fn for_print(ctx: &Context) -> String {
    let mut string = String::new();

    match ctx {
      Context::Header { time, source, location } => {
        time.for_print(&mut string);
        write!(string, "     ").unwrap();
        source.for_print(&mut string);
        write!(string, " - ").unwrap();
        location.for_print(&mut string);
        write!(string, " - Session Start").unwrap();
      }

      Context::Footer { time, source, location, elapsed } => {
        time.for_print(&mut string);
        write!(string, "     ").unwrap();
        source.for_print(&mut string);
        write!(string, " - ").unwrap();
        location.for_print(&mut string);
        write!(string, " - Session End ({}us)", elapsed.as_micros()).unwrap();
      }

      Context::Message { time, source, location, level, message, .. } => {
        time.for_print(&mut string);
        write!(string, " ").unwrap();
        level.for_print(&mut string);
        write!(string, " ").unwrap();
        source.for_print(&mut string);
        write!(string, " - ").unwrap();
        location.for_print(&mut string);
        write!(string, " - {message}").unwrap();
      }
    }

    string
  }
}