fail2ban-log-parser-core 0.1.2

Fast, zero-copy fail2ban log parser built with winnow
Documentation
use std::fmt;

use winnow::{
    Parser,
    ascii::Caseless,
    combinator::{alt, opt},
    error::StrContext,
};

#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Fail2BanLevel {
    Info,
    Notice,
    Warning,
    Error,
    Debug,
}

impl fmt::Display for Fail2BanLevel {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            Self::Info => write!(f, "Info"),
            Self::Notice => write!(f, "Notice"),
            Self::Warning => write!(f, "Warning"),
            Self::Error => write!(f, "Error"),
            Self::Debug => write!(f, "Debug"),
        }
    }
}

pub(super) fn parse_level(input: &mut &str) -> winnow::Result<Option<Fail2BanLevel>> {
    opt(alt((
        Caseless("info").value(Fail2BanLevel::Info),
        Caseless("notice").value(Fail2BanLevel::Notice),
        Caseless("warning").value(Fail2BanLevel::Warning),
        Caseless("error").value(Fail2BanLevel::Error),
        Caseless("debug").value(Fail2BanLevel::Debug),
    ))
    .context(StrContext::Label(
        "valid log level (info, notice, warning, error, or debug)",
    )))
    .parse_next(input)
}