1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use api::LogLevel;
use serde::de::{self, Deserialize, Deserializer, Visitor};
use std::fmt;
struct LogLevelVisitor;
impl<'de> Visitor<'de> for LogLevelVisitor {
type Value = LogLevel;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("ERROR | WARN | INFO | DEBUG | NOTICE")
}
fn visit_str<E>(self, s: &str) -> Result<LogLevel, E>
where
E: de::Error,
{
let upper = s.to_ascii_uppercase();
match upper.as_str() {
"INFO" => Ok(LogLevel::Info),
"DEBUG" => Ok(LogLevel::Debug),
"ERR" | "ERROR" => Ok(LogLevel::Error),
"WARN" | "WARNING" => Ok(LogLevel::Warning),
"NOTICE" => Ok(LogLevel::Notice),
x => Err(E::custom(format!("Did not expect log level of: {}", x))),
}
}
}
impl<'de> Deserialize<'de> for LogLevel {
fn deserialize<D>(deserializer: D) -> Result<LogLevel, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_str(LogLevelVisitor)
}
}