cuprated/config/
tracing_config.rs
1use serde::{Deserialize, Serialize};
2use tracing::level_filters::LevelFilter;
3
4use super::macros::config_struct;
5
6config_struct! {
7 #[derive(Debug, Default, Deserialize, Serialize, Eq, PartialEq)]
9 #[serde(deny_unknown_fields, default)]
10 pub struct TracingConfig {
11 #[child = true]
12 pub stdout: StdoutTracingConfig,
14
15 #[child = true]
16 pub file: FileTracingConfig,
18 }
19}
20
21config_struct! {
22 #[derive(Debug, Deserialize, Serialize, Eq, PartialEq)]
23 #[serde(deny_unknown_fields, default)]
24 pub struct StdoutTracingConfig {
25 ##[serde(with = "level_filter_serde")]
34 pub level: LevelFilter,
35 }
36}
37
38impl Default for StdoutTracingConfig {
39 fn default() -> Self {
40 Self {
41 level: LevelFilter::INFO,
42 }
43 }
44}
45
46config_struct! {
47 #[derive(Debug, Deserialize, Serialize, Eq, PartialEq)]
48 #[serde(deny_unknown_fields, default)]
49 pub struct FileTracingConfig {
50 ##[serde(with = "level_filter_serde")]
59 pub level: LevelFilter,
60
61 pub max_log_files: usize,
69 }
70}
71
72impl Default for FileTracingConfig {
73 fn default() -> Self {
74 Self {
75 level: LevelFilter::DEBUG,
76 max_log_files: 7,
77 }
78 }
79}
80
81mod level_filter_serde {
82 use std::str::FromStr;
83
84 use serde::{Deserialize, Deserializer, Serializer};
85 use tracing::level_filters::LevelFilter;
86
87 #[expect(clippy::trivially_copy_pass_by_ref, reason = "serde")]
88 pub fn serialize<S>(level_filter: &LevelFilter, s: S) -> Result<S::Ok, S::Error>
89 where
90 S: Serializer,
91 {
92 s.serialize_str(&level_filter.to_string())
93 }
94
95 pub fn deserialize<'de, D>(d: D) -> Result<LevelFilter, D::Error>
96 where
97 D: Deserializer<'de>,
98 {
99 let s = String::deserialize(d)?;
100 LevelFilter::from_str(&s).map_err(serde::de::Error::custom)
101 }
102}