zeronsd 0.5.0

Unicast DNS resolver for ZeroTier networks
Documentation
use std::str::FromStr;

use anyhow::anyhow;
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum LevelFilter {
    #[serde(rename(deserialize = "off"))]
    Off,
    #[serde(rename(deserialize = "error"))]
    Error,
    #[serde(rename(deserialize = "warn"))]
    Warn,
    #[serde(rename(deserialize = "info"))]
    Info,
    #[serde(rename(deserialize = "trace"))]
    Trace,
    #[serde(rename(deserialize = "debug"))]
    Debug,
}

impl LevelFilter {
    pub fn to_log(&self) -> Option<tracing::Level> {
        match self {
            LevelFilter::Off => None,
            LevelFilter::Error => Some(tracing::Level::ERROR),
            LevelFilter::Warn => Some(tracing::Level::WARN),
            LevelFilter::Info => Some(tracing::Level::INFO),
            LevelFilter::Trace => Some(tracing::Level::TRACE),
            LevelFilter::Debug => Some(tracing::Level::DEBUG),
        }
    }
}

impl ToString for LevelFilter {
    fn to_string(&self) -> String {
        match self {
            LevelFilter::Off => "off",
            LevelFilter::Error => "error",
            LevelFilter::Warn => "warn",
            LevelFilter::Info => "info",
            LevelFilter::Trace => "trace",
            LevelFilter::Debug => "debug",
        }
        .to_string()
    }
}

impl FromStr for LevelFilter {
    type Err = anyhow::Error;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "off" => Ok(Self::Off),
            "error" => Ok(Self::Error),
            "warn" => Ok(Self::Warn),
            "info" => Ok(Self::Info),
            "trace" => Ok(Self::Trace),
            "debug" => Ok(Self::Debug),
            _ => Err(anyhow!(
                "invalid format: allowed values: [off, error, warn, info, debug, trace]"
            )),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::LevelFilter;
    use std::str::FromStr;

    #[test]
    fn test_level_from_str() {
        for item in vec![
            ("off", LevelFilter::Off),
            ("error", LevelFilter::Error),
            ("warn", LevelFilter::Warn),
            ("info", LevelFilter::Info),
            ("trace", LevelFilter::Trace),
            ("debug", LevelFilter::Debug),
        ] {
            assert_eq!(LevelFilter::from_str(item.0).unwrap(), item.1)
        }

        assert!(LevelFilter::from_str("foo").is_err());
    }

    #[test]
    fn test_level_to_string() {
        for item in vec![
            (LevelFilter::Off, "off"),
            (LevelFilter::Error, "error"),
            (LevelFilter::Warn, "warn"),
            (LevelFilter::Info, "info"),
            (LevelFilter::Trace, "trace"),
            (LevelFilter::Debug, "debug"),
        ] {
            assert_eq!(item.0.to_string(), item.1)
        }
    }
}