support_kit/logs/
logger_preset.rs

1use serde::{Deserialize, Serialize};
2
3use super::{LogLevel, LogRotation, LogTarget, LoggerConfig, LoggerConfigOrPreset};
4
5#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
6#[serde(rename_all = "kebab-case")]
7pub enum LoggerPreset {
8    Error,
9    RollingInfo,
10    RollingDebug,
11    Stdout,
12    Stderr,
13}
14
15impl From<LoggerPreset> for LoggerConfig {
16    fn from(preset: LoggerPreset) -> Self {
17        match preset {
18            LoggerPreset::Error => error(),
19            LoggerPreset::RollingInfo => rolling_info(),
20            LoggerPreset::RollingDebug => rolling_debug(),
21            LoggerPreset::Stdout => stdout(),
22            LoggerPreset::Stderr => stderr(),
23        }
24    }
25}
26
27impl From<LoggerPreset> for LoggerConfigOrPreset {
28    fn from(value: LoggerPreset) -> Self {
29        Self::Preset(value)
30    }
31}
32
33fn error() -> LoggerConfig {
34    LoggerConfig::builder()
35        .level(LogLevel::Error..LogLevel::Warn)
36        .file(("logs", "app.error"))
37        .build()
38}
39
40fn rolling_info() -> LoggerConfig {
41    LoggerConfig::builder()
42        .level(LogLevel::Info)
43        .file(("logs", "app", LogRotation::Daily))
44        .build()
45}
46
47fn rolling_debug() -> LoggerConfig {
48    LoggerConfig::builder()
49        .level(LogLevel::Error..LogLevel::Trace)
50        .file(("logs", "app.debug", LogRotation::PerMinute))
51        .build()
52}
53
54fn stdout() -> LoggerConfig {
55    LoggerConfig::builder()
56        .level(LogLevel::Info..LogLevel::Trace)
57        .console(LogTarget::Stdout)
58        .build()
59}
60
61fn stderr() -> LoggerConfig {
62    LoggerConfig::builder()
63        .level(LogLevel::Error..LogLevel::Warn)
64        .console(LogTarget::Stderr)
65        .build()
66}
67
68#[test]
69fn logging_presets() -> Result<(), Box<dyn std::error::Error>> {
70    use super::LoggingConfig;
71
72    let config: LoggingConfig = serde_json::from_str(r#""stderr""#)?;
73
74    assert_eq!(config, LoggingConfig::One(LoggerPreset::Stderr.into()));
75
76    let config: LoggingConfig = serde_json::from_str(
77        r#"
78        ["stderr", "stdout", "error", "rolling-info", "rolling-debug"]
79        "#,
80    )?;
81
82    assert_eq!(
83        config,
84        LoggingConfig::Many(vec![
85            LoggerPreset::Stderr.into(),
86            LoggerPreset::Stdout.into(),
87            LoggerPreset::Error.into(),
88            LoggerPreset::RollingInfo.into(),
89            LoggerPreset::RollingDebug.into(),
90        ]),
91    );
92
93    Ok(())
94}
95
96#[test]
97fn stdout_preset() {
98    let config: LoggerConfig = LoggerPreset::Stdout.into();
99
100    let expectation = LoggerConfig::builder()
101        .level(LogLevel::Info..LogLevel::Trace)
102        .console(LogTarget::Stdout)
103        .build();
104
105    assert_eq!(config, expectation);
106}
107
108#[test]
109fn stderr_preset() {
110    let config: LoggerConfig = LoggerPreset::Stderr.into();
111
112    let expectation = LoggerConfig::builder()
113        .level(LogLevel::Error..LogLevel::Warn)
114        .console(LogTarget::Stderr)
115        .build();
116
117    assert_eq!(config, expectation);
118}
119
120#[test]
121fn error_preset() {
122    let config: LoggerConfig = LoggerPreset::Error.into();
123    let expectation = LoggerConfig::builder()
124        .level(LogLevel::Error..LogLevel::Warn)
125        .file(("logs", "app.error"))
126        .build();
127
128    assert_eq!(config, expectation);
129}
130
131#[test]
132fn rolling_info_preset() {
133    let config: LoggerConfig = LoggerPreset::RollingInfo.into();
134
135    let expectation = LoggerConfig::builder()
136        .level(LogLevel::Info)
137        .file(("logs", "app", LogRotation::Daily))
138        .build();
139
140    assert_eq!(config, expectation);
141}
142
143#[test]
144fn rolling_debug_preset() {
145    let config: LoggerConfig = LoggerPreset::RollingDebug.into();
146
147    let expectation = LoggerConfig::builder()
148        .level(LogLevel::Error..LogLevel::Trace)
149        .file(("logs", "app.debug", LogRotation::PerMinute))
150        .build();
151
152    assert_eq!(config, expectation);
153}