vault 11.0.1

A parser for Company of Heroes replay files.
Documentation
use crate::data::parser::{parse_utf16_terminated, parse_utf8_fixed, take_zeroes, verify_zero_u16};
use crate::data::{ParserResult, Span};
use nom::combinator::map;
use nom::number::complete::le_u16;
use nom::sequence::{preceded, tuple};
use nom_tracable::tracable_parser;

#[derive(Debug, Clone)]
pub struct Header {
    pub version: u16,
    _game_type: String,
    pub timestamp: String,
}

impl Header {
    #[tracable_parser]
    pub fn parse_header(input: Span) -> ParserResult<Header> {
        map(
            tuple((
                Self::parse_version,
                Self::parse_game_type,
                Self::parse_timestamp,
                Self::clear_zeroes,
            )),
            |(version, game_type, timestamp, _)| Header {
                version,
                _game_type: game_type,
                timestamp,
            },
        )(input)
    }

    #[tracable_parser]
    fn parse_version(input: Span) -> ParserResult<u16> {
        preceded(verify_zero_u16, le_u16)(input)
    }

    #[tracable_parser]
    fn parse_game_type(input: Span) -> ParserResult<String> {
        parse_utf8_fixed(8usize)(input)
    }

    #[tracable_parser]
    fn parse_timestamp(input: Span) -> ParserResult<String> {
        parse_utf16_terminated(input)
    }

    #[tracable_parser]
    fn clear_zeroes(input: Span) -> ParserResult<Span> {
        take_zeroes(input)
    }
}