1use bon::builder;
4use bon::Builder;
5use strum::EnumString;
6use tracing_glog::Glog;
7use tracing_glog::GlogFields;
8use tracing_glog::LocalTime;
9use tracing_subscriber::fmt::writer::BoxMakeWriter;
10use tracing_subscriber::EnvFilter;
11use tracing_subscriber::Layer;
12
13use super::BoxLayer;
14
15#[derive(Debug, Clone, Copy, EnumString)]
16#[strum(ascii_case_insensitive)]
17pub enum LinesFormat {
18 Glog,
19 Json,
20 Full,
21 Simple,
22}
23
24#[derive(Debug, Builder)]
25pub struct LinesConfig {
26 writer: BoxMakeWriter,
27 filter: EnvFilter,
28 #[builder(default = LinesFormat::Glog)]
29 format: LinesFormat,
30}
31
32impl LinesConfig {
33 pub fn layer(self) -> BoxLayer {
34 match self.format {
35 LinesFormat::Glog => self.glog_layer(),
36 LinesFormat::Json => self.json_layer(),
37 LinesFormat::Full => self.full_layer(),
38 LinesFormat::Simple => self.simple_layer(),
39 }
40 }
41
42 fn glog_layer(self) -> BoxLayer {
44 tracing_subscriber::fmt::layer()
45 .event_format(Glog::default().with_timer(LocalTime::default()))
46 .fmt_fields(GlogFields::default())
47 .with_writer(self.writer)
48 .with_filter(self.filter)
49 .boxed()
50 }
51
52 fn json_layer(self) -> BoxLayer {
53 tracing_subscriber::fmt::layer()
54 .json()
55 .with_writer(self.writer)
56 .with_filter(self.filter)
57 .boxed()
58 }
59
60 fn full_layer(self) -> BoxLayer {
61 tracing_subscriber::fmt::layer()
62 .with_writer(self.writer)
63 .with_filter(self.filter)
64 .boxed()
65 }
66
67 fn simple_layer(self) -> BoxLayer {
68 tracing_subscriber::fmt::layer()
69 .compact()
70 .with_level(false)
71 .with_target(false)
72 .without_time()
73 .with_writer(self.writer)
74 .with_filter(self.filter)
75 .boxed()
76 }
77}