tracing-formatters 0.0.1

Tracing output formatters
Documentation
use crate::log_value::LogValue;

#[derive(Debug)]
pub enum Facility {
    KernelMessages = 0,
    UserlevelMessages = 1,
    MailSystem = 2,
    SystemDaemons = 3,
    SecurityMessages = 4,
    MessagesGeneratedInternallyBySyslogd = 5,
    LinePrinterSubsystem = 6,
    NetworkNewsSubsystem = 7,
    UucpSubsystem = 8,
    ClockDaemon = 9,
    AuthorizationMessages = 10,
    FtpDaemon = 11,
    NtpSubsystem = 12,
    LogAudit = 13,
    LogAlert = 14,
    Note2 = 15,
    LocalUse0 = 16,
    LocalUse1 = 17,
    LocalUse2 = 18,
    LocalUse3 = 19,
    LocalUse4 = 20,
    LocalUse5 = 21,
    LocalUse6 = 22,
    LocalUse7 = 23,
}

pub enum FacilityConversionError {
    IntegerNumberNotPartOfFacilityRange,
    UnsignedIntegerNumberNotPartOfFacilityRange,
    FloatingNumberNotPartOfFacilityRange(String),
    BoolCannotBeConverted,
    UnableToConvertTimestamp,
    StringCannotBeConverted(String),
    DebugStringCannotBeConverted(String),
    UnableToConvertSeverity,
}

impl TryFrom<LogValue> for Facility {
    type Error = FacilityConversionError;
    fn try_from(l: LogValue) -> Result<Self, Self::Error> {
        match l {
            LogValue::I64(i) => Facility::try_from(i),
            LogValue::U64(u) => Facility::try_from(u),
            LogValue::F64(f) => Facility::try_from(f),
            LogValue::Bool(_) => Err(FacilityConversionError::BoolCannotBeConverted),
            LogValue::String(s) => Self::try_from(s),
            LogValue::Debug(s) => Self::try_from(s),
            LogValue::TimeStamp(_) => Err(FacilityConversionError::UnableToConvertTimestamp),
            LogValue::Severity(_) => Err(FacilityConversionError::UnableToConvertSeverity),
        }
    }
}

impl TryFrom<i64> for Facility {
    type Error = FacilityConversionError;

    fn try_from(i: i64) -> Result<Self, Self::Error> {
        match i {
            0 => Ok(Facility::KernelMessages),
            1 => Ok(Facility::UserlevelMessages),
            2 => Ok(Facility::MailSystem),
            3 => Ok(Facility::SystemDaemons),
            4 => Ok(Facility::SecurityMessages),
            5 => Ok(Facility::MessagesGeneratedInternallyBySyslogd),
            6 => Ok(Facility::LinePrinterSubsystem),
            7 => Ok(Facility::NetworkNewsSubsystem),
            8 => Ok(Facility::UucpSubsystem),
            9 => Ok(Facility::ClockDaemon),
            10 => Ok(Facility::AuthorizationMessages),
            11 => Ok(Facility::FtpDaemon),
            12 => Ok(Facility::NtpSubsystem),
            13 => Ok(Facility::LogAudit),
            14 => Ok(Facility::LogAlert),
            15 => Ok(Facility::Note2),
            16 => Ok(Facility::LocalUse0),
            17 => Ok(Facility::LocalUse1),
            18 => Ok(Facility::LocalUse2),
            19 => Ok(Facility::LocalUse3),
            20 => Ok(Facility::LocalUse4),
            21 => Ok(Facility::LocalUse5),
            22 => Ok(Facility::LocalUse6),
            23 => Ok(Facility::LocalUse7),
            _ => Err(FacilityConversionError::IntegerNumberNotPartOfFacilityRange),
        }
    }
}

impl TryFrom<String> for Facility {
    type Error = FacilityConversionError;

    fn try_from(s: String) -> Result<Self, Self::Error> {
        match s.to_ascii_lowercase().as_str() {
            "kernelmessages" => Ok(Facility::KernelMessages),
            "userlevelmessages" => Ok(Facility::UserlevelMessages),
            "mailsystem" => Ok(Facility::MailSystem),
            "systemdaemons" => Ok(Facility::SystemDaemons),
            "securitymessages" => Ok(Facility::SecurityMessages),
            "messagesgeneratedinternallybysyslogd" => {
                Ok(Facility::MessagesGeneratedInternallyBySyslogd)
            }
            "lineprintersubsystem" => Ok(Facility::LinePrinterSubsystem),
            "networknewssubsystem" => Ok(Facility::NetworkNewsSubsystem),
            "uucpsubsystem" => Ok(Facility::UucpSubsystem),
            "clockdaemon" => Ok(Facility::ClockDaemon),
            "authorizationmessages" => Ok(Facility::AuthorizationMessages),
            "ftpdaemon" => Ok(Facility::FtpDaemon),
            "ntpsubsystem" => Ok(Facility::NtpSubsystem),
            "logaudit" => Ok(Facility::LogAudit),
            "logalert" => Ok(Facility::LogAlert),
            "note2" => Ok(Facility::Note2),
            "localuse0" => Ok(Facility::LocalUse0),
            "localuse1" => Ok(Facility::LocalUse1),
            "localuse2" => Ok(Facility::LocalUse2),
            "localuse3" => Ok(Facility::LocalUse3),
            "localuse4" => Ok(Facility::LocalUse4),
            "localuse5" => Ok(Facility::LocalUse5),
            "localuse6" => Ok(Facility::LocalUse6),
            "localuse7" => Ok(Facility::LocalUse7),
            _ => Err(FacilityConversionError::StringCannotBeConverted(s)),
        }
    }
}

impl TryFrom<u64> for Facility {
    type Error = FacilityConversionError;

    fn try_from(u: u64) -> Result<Self, Self::Error> {
        Facility::try_from(u as i64)
    }
}
impl TryFrom<f64> for Facility {
    type Error = FacilityConversionError;

    fn try_from(f: f64) -> Result<Self, Self::Error> {
        let f = f.round();

        if f.is_nan() {
            return Err(
                FacilityConversionError::FloatingNumberNotPartOfFacilityRange(
                    "Float NaN".to_string(),
                ),
            );
        }
        if f < 0.0 {
            return Err(
                FacilityConversionError::FloatingNumberNotPartOfFacilityRange(
                    "Float Underflow".to_string(),
                ),
            );
        }
        if f > i64::MAX as f64 {
            return Err(
                FacilityConversionError::FloatingNumberNotPartOfFacilityRange(
                    "Float Overflow".to_string(),
                ),
            );
        }
        Facility::try_from(f as i64)
    }
}

impl From<Facility> for u32 {
    fn from(facility: Facility) -> u32 {
        Self::from(&facility)
    }
}

impl From<&Facility> for u32 {
    fn from(facility: &Facility) -> u32 {
        match facility {
            Facility::KernelMessages => 0,
            Facility::UserlevelMessages => 1,
            Facility::MailSystem => 2,
            Facility::SystemDaemons => 3,
            Facility::SecurityMessages => 4,
            Facility::MessagesGeneratedInternallyBySyslogd => 5,
            Facility::LinePrinterSubsystem => 6,
            Facility::NetworkNewsSubsystem => 7,
            Facility::UucpSubsystem => 8,
            Facility::ClockDaemon => 9,
            Facility::AuthorizationMessages => 10,
            Facility::FtpDaemon => 11,
            Facility::NtpSubsystem => 12,
            Facility::LogAudit => 13,
            Facility::LogAlert => 14,
            Facility::Note2 => 15,
            Facility::LocalUse0 => 16,
            Facility::LocalUse1 => 17,
            Facility::LocalUse2 => 18,
            Facility::LocalUse3 => 19,
            Facility::LocalUse4 => 20,
            Facility::LocalUse5 => 21,
            Facility::LocalUse6 => 22,
            Facility::LocalUse7 => 23,
        }
    }
}