1use serde::{Deserialize, Serialize};
2
3use crate::error::Result;
4use std::str::FromStr;
5
6#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
7pub enum LogLevel {
8 #[serde(rename = "debug")]
9 Debug,
10 #[serde(rename = "info")]
11 Info,
12 #[serde(rename = "warn")]
13 Warn,
14 #[serde(rename = "error")]
15 Error,
16}
17
18impl std::fmt::Display for LogLevel {
19 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
20 let s = match *self {
21 LogLevel::Debug => "debug",
22 LogLevel::Info => "info",
23 LogLevel::Warn => "warn",
24 LogLevel::Error => "error",
25 };
26 write!(f, "{}", s)
27 }
28}
29
30impl FromStr for LogLevel {
31 type Err = crate::error::Error;
32
33 fn from_str(s: &str) -> Result<Self> {
34 match s {
35 "debug" => Ok(LogLevel::Debug),
36 "info" => Ok(LogLevel::Info),
37 "warn" => Ok(LogLevel::Warn),
38 "error" => Ok(LogLevel::Error),
39 _ => Ok(LogLevel::Info),
40 }
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use super::*;
47
48 #[test]
49 fn test_log_level_display() {
50 assert_eq!(LogLevel::Debug.to_string(), "debug");
51 assert_eq!(LogLevel::Info.to_string(), "info");
52 assert_eq!(LogLevel::Warn.to_string(), "warn");
53 assert_eq!(LogLevel::Error.to_string(), "error");
54 }
55
56 #[test]
57 fn test_log_level_from_str() {
58 assert_eq!(LogLevel::from_str("debug").unwrap(), LogLevel::Debug);
59 assert_eq!(LogLevel::from_str("info").unwrap(), LogLevel::Info);
60 assert_eq!(LogLevel::from_str("warn").unwrap(), LogLevel::Warn);
61 assert_eq!(LogLevel::from_str("error").unwrap(), LogLevel::Error);
62
63 assert_eq!(LogLevel::from_str("invalid").unwrap(), LogLevel::Info);
65 assert_eq!(LogLevel::from_str("").unwrap(), LogLevel::Info);
66 }
67
68 #[test]
69 fn test_log_level_serialization() {
70 let debug_json = serde_json::to_string(&LogLevel::Debug).unwrap();
72 assert_eq!(debug_json, "\"debug\"");
73
74 let info_json = serde_json::to_string(&LogLevel::Info).unwrap();
75 assert_eq!(info_json, "\"info\"");
76 }
77
78 #[test]
79 fn test_log_level_deserialization() {
80 let debug: LogLevel = serde_json::from_str("\"debug\"").unwrap();
82 assert_eq!(debug, LogLevel::Debug);
83
84 let info: LogLevel = serde_json::from_str("\"info\"").unwrap();
85 assert_eq!(info, LogLevel::Info);
86 }
87
88 #[test]
89 fn test_log_level_debug() {
90 let debug = LogLevel::Debug;
91 let debug_str = format!("{:?}", debug);
92 assert!(debug_str.contains("Debug"));
93 }
94}