minor parse optimizations

This commit is contained in:
Robin Appelman 2023-03-04 22:46:31 +01:00
commit 97ad9d634b
3 changed files with 13 additions and 3 deletions

View file

@ -285,7 +285,14 @@ fn param_parse_with<'a, T, P: Fn(&'a str) -> IResult<&'a str, T>>(
let input = &input[has_open as usize..];
Ok((input.trim_start_matches(' '), value))
debug_assert!(
input.is_empty() || input.as_bytes()[0] == b' ',
"\"{}\" starts with space",
input
);
let input = &input[(!input.is_empty() as usize)..];
Ok((input, value))
}
}

View file

@ -138,6 +138,7 @@ pub struct LineSplit<'a> {
impl<'a> LineSplit<'a> {
pub fn new(input: &'a str) -> Self {
let input = &input[2..]; //skip first
LineSplit {
input,
start: 0,
@ -152,7 +153,7 @@ impl<'a> Iterator for LineSplit<'a> {
fn next(&mut self) -> Option<Self::Item> {
match self.iter.next() {
Some(next) => {
let line = &self.input[self.start..next];
let line = &self.input[self.start..next - 1]; // -1 for the newline we strip
self.start = next + 2;
Some(line)
}

View file

@ -30,11 +30,13 @@ fn event_parser(input: &str) -> Result<RawEvent> {
let (input, ty) = event_type_parser(&input[1..])?;
let params = &input[(!input.is_empty() as usize)..];
Ok(RawEvent {
date,
subject,
ty,
params: &input[1..],
params,
})
}