support_kit/logs/
logger_preset.rs1use 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}