cuprated/config/
tracing_config.rs

1use serde::{Deserialize, Serialize};
2use tracing::level_filters::LevelFilter;
3
4/// [`tracing`] config.
5#[derive(Debug, Default, Deserialize, Serialize, Eq, PartialEq)]
6#[serde(deny_unknown_fields, default)]
7pub struct TracingConfig {
8    pub stdout: StdoutTracingConfig,
9    pub file: FileTracingConfig,
10}
11
12#[derive(Debug, Deserialize, Serialize, Eq, PartialEq)]
13#[serde(deny_unknown_fields, default)]
14pub struct StdoutTracingConfig {
15    /// The default minimum log level.
16    #[serde(with = "level_filter_serde")]
17    pub level: LevelFilter,
18}
19
20impl Default for StdoutTracingConfig {
21    fn default() -> Self {
22        Self {
23            level: LevelFilter::INFO,
24        }
25    }
26}
27
28#[derive(Debug, Deserialize, Serialize, Eq, PartialEq)]
29#[serde(deny_unknown_fields, default)]
30pub struct FileTracingConfig {
31    /// The default minimum log level.
32    #[serde(with = "level_filter_serde")]
33    pub level: LevelFilter,
34    /// The maximum amount of log files to keep, once this number is passed the oldest file
35    /// will be deleted.
36    pub max_log_files: usize,
37}
38
39impl Default for FileTracingConfig {
40    fn default() -> Self {
41        Self {
42            level: LevelFilter::DEBUG,
43            max_log_files: 7,
44        }
45    }
46}
47
48mod level_filter_serde {
49    use std::str::FromStr;
50
51    use serde::{Deserialize, Deserializer, Serializer};
52    use tracing::level_filters::LevelFilter;
53
54    #[expect(clippy::trivially_copy_pass_by_ref, reason = "serde")]
55    pub fn serialize<S>(level_filter: &LevelFilter, s: S) -> Result<S::Ok, S::Error>
56    where
57        S: Serializer,
58    {
59        s.serialize_str(&level_filter.to_string())
60    }
61
62    pub fn deserialize<'de, D>(d: D) -> Result<LevelFilter, D::Error>
63    where
64        D: Deserializer<'de>,
65    {
66        let s = String::deserialize(d)?;
67        LevelFilter::from_str(&s).map_err(serde::de::Error::custom)
68    }
69}