cuprated/config/
tracing_config.rs

1use serde::{Deserialize, Serialize};
2use tracing::level_filters::LevelFilter;
3
4use super::macros::config_struct;
5
6config_struct! {
7    /// [`tracing`] config.
8    #[derive(Debug, Default, Deserialize, Serialize, Eq, PartialEq)]
9    #[serde(deny_unknown_fields, default)]
10    pub struct TracingConfig {
11        #[child = true]
12        /// Configuration for cuprated's stdout logging system.
13        pub stdout: StdoutTracingConfig,
14
15        #[child = true]
16        /// Configuration for cuprated's file logging system.
17        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        /// The minimum log level for stdout.
26        ///
27        /// Levels below this one will not be shown.
28        /// "error" is the highest level only showing errors,
29        /// "trace" is the lowest showing as much as possible.
30        ///
31        /// Type         | Level
32        /// Valid values | "error", "warn", "info", "debug", "trace"
33        ##[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        /// The minimum log level for file logs.
51        ///
52        /// Levels below this one will not be shown.
53        /// "error" is the highest level only showing errors,
54        /// "trace" is the lowest showing as much as possible.
55        ///
56        /// Type         | Level
57        /// Valid values | "error", "warn", "info", "debug", "trace"
58        ##[serde(with = "level_filter_serde")]
59        pub level: LevelFilter,
60
61        /// The maximum amount of log files to keep.
62        ///
63        /// Once this number is passed the oldest file will be deleted.
64        ///
65        /// Type         | Number
66        /// Valid values | >= 0
67        /// Examples     | 0, 7, 200
68        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}