collectd_plugin/de/
level.rs

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