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) } }