fail2ban-log-parser-core 0.1.2

Fast, zero-copy fail2ban log parser built with winnow
Documentation
use winnow::{Parser, ascii::digit1, combinator::empty};

#[derive(Debug, PartialEq, Clone)]
pub(super) struct ParsedTime {
    pub(super) hour: u32,
    pub(super) minute: u32,
    pub(super) second: u32,
    pub(super) millisecond: u32,
}

pub(crate) fn parse_time(input: &mut &str) -> winnow::Result<ParsedTime> {
    let hour = digit1.parse_to::<u32>().parse_next(input)?;
    ':'.parse_next(input)?;
    let minute = digit1.parse_to::<u32>().parse_next(input)?;
    ':'.parse_next(input)?;
    let second = digit1.parse_to::<u32>().parse_next(input)?;

    let millisecond = winnow::combinator::alt((
        (',', digit1.parse_to::<u32>()).map(|(_, v)| v),
        ('.', digit1.parse_to::<u32>()).map(|(_, v)| v),
        empty.value(0u32),
    ))
    .parse_next(input)?;

    Ok(ParsedTime {
        hour,
        minute,
        second,
        millisecond,
    })
}