aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/raw/parser.rs53
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)
+}