diff options
author | Daniel Schadt <kingdread@gmx.de> | 2019-05-24 16:49:34 +0200 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2019-05-24 16:49:34 +0200 |
commit | 4deac1e38c0db43479cb1295dd4028e1599ee0bc (patch) | |
tree | c10e19f6988455610557011495b6965342720c7c /src/raw/parser.rs | |
parent | cbd84c3262b10ebff6d5508370287be05b2bfb3b (diff) | |
download | evtclib-4deac1e38c0db43479cb1295dd4028e1599ee0bc.tar.gz evtclib-4deac1e38c0db43479cb1295dd4028e1599ee0bc.tar.bz2 evtclib-4deac1e38c0db43479cb1295dd4028e1599ee0bc.zip |
add support for partially parsing an EVTC file
Diffstat (limited to 'src/raw/parser.rs')
-rw-r--r-- | src/raw/parser.rs | 53 |
1 files changed, 46 insertions, 7 deletions
diff --git a/src/raw/parser.rs b/src/raw/parser.rs index a3a1cd5..fa3b36c 100644 --- a/src/raw/parser.rs +++ b/src/raw/parser.rs @@ -97,6 +97,16 @@ pub struct Evtc { pub events: Vec<CbtEvent>, } +/// A partially-parsed EVTC file, containing everything but the events. +/// This can speed up parsing for applications which can work with the header. +#[derive(Clone, Debug)] +pub struct PartialEvtc { + pub header: Header, + pub skill_count: u32, + pub agents: Vec<Agent>, + pub skills: Vec<Skill>, +} + quick_error! { #[derive(Debug)] pub enum ParseError { @@ -391,25 +401,54 @@ pub fn parse_event_rev1<T: Read>(input: &mut T) -> ParseResult<CbtEvent> { is_offcycle, }) } -/// Parse a complete EVTC file. + + + +/// Parse a partial EVTC file. /// /// * `input` - Input stream. -pub fn parse_file<T: Read>(input: &mut T) -> ParseResult<Evtc> { +pub fn parse_partial_file<T: Read>(input: &mut T) -> ParseResult<PartialEvtc> { let header = parse_header(input)?; let agents = parse_agents(input, header.agent_count)?; let skill_count = input.read_u32::<LittleEndian>()?; let skills = parse_skills(input, skill_count)?; - let events = match header.revision { + + Ok(PartialEvtc { + header, + skill_count, + agents, + skills, + }) +} + + + +/// Finish a partial EVTC by reading the events. +/// +/// * `partial` - The partial EVTC. +/// * `input` - The input stream. +pub fn finish_parsing<T: Read>(partial: PartialEvtc, input: &mut T) -> ParseResult<Evtc> { + let events = match partial.header.revision { 0 => parse_events(input, parse_event_rev0)?, 1 => parse_events(input, parse_event_rev1)?, x => return Err(ParseError::UnknownRevision(x)), }; Ok(Evtc { - header, - skill_count, - agents, - skills, + header: partial.header, + skill_count: partial.skill_count, + agents: partial.agents, + skills: partial.skills, events, }) } + + + +/// Parse a complete EVTC file. +/// +/// * `input` - Input stream. +pub fn parse_file<T: Read>(input: &mut T) -> ParseResult<Evtc> { + let partial = parse_partial_file(input)?; + finish_parsing(partial, input) +} |