cuprated/config/
tracing_config.rs1use serde::{Deserialize, Serialize};
2use tracing::level_filters::LevelFilter;
3
4#[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 #[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 #[serde(with = "level_filter_serde")]
33 pub level: LevelFilter,
34 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}