From 18c45cdb5734b173239761a85cfd9210bf0b8e40 Mon Sep 17 00:00:00 2001 From: Nimi Wariboko Jr Date: Wed, 20 Dec 2023 14:59:36 -0800 Subject: [PATCH 1/2] Parser: Allow connection line to be specified multiple times --- src/parser.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/parser.rs b/src/parser.rs index 195666b..41ebd01 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -520,7 +520,7 @@ impl Session { // Parse connection line: // - Can exist not at all or exactly once per session - b'c' => parse_rejecting_duplicates( + b'c' => parse_skipping_duplicates( &mut connection, &line, ParserError::MultipleConnections, @@ -623,6 +623,24 @@ fn parse_rejecting_duplicates< Ok(()) } +fn parse_skipping_duplicates< + T, + E: Fn(usize) -> ParserError, + P: Fn(&Line) -> Result, +>( + value: &mut Option, + line: &Line<'_>, + duplicate_error_fn: E, + parser: P, +) -> Result<(), ParserError> { + if value.is_some() { + let _ = parser(line)?; + return Ok(()) + } + *value = Some(parser(line)?); + Ok(()) +} + // Field parser helpers on byte slice iterators fn parse_str<'a>( it: &mut impl Iterator, From d9add17b2e277f88a345ee85f14687ce28ed82c2 Mon Sep 17 00:00:00 2001 From: Nimi Wariboko Jr Date: Sun, 31 Dec 2023 10:52:15 -0800 Subject: [PATCH 2/2] Cleanup warnings --- src/parser.rs | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 41ebd01..6f0ee39 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -43,6 +43,7 @@ pub enum ParserError { /// A second URI line was found at the given line. MultipleUris(usize), /// A second connection line was found at the given line. + #[deprecated(note = "This is no longer considered an error.")] MultipleConnections(usize), /// A second time zone line was found at the given line. MultipleTimeZones(usize), @@ -100,6 +101,7 @@ impl std::fmt::Display for ParserError { write!(f, "Multiple session-information in line {}", line) } ParserError::MultipleUris(line) => write!(f, "Multiple URIs in line {}", line), + #[allow(deprecated)] ParserError::MultipleConnections(line) => { write!(f, "Multiple connections in line {}", line) } @@ -520,12 +522,7 @@ impl Session { // Parse connection line: // - Can exist not at all or exactly once per session - b'c' => parse_skipping_duplicates( - &mut connection, - &line, - ParserError::MultipleConnections, - Connection::parse, - )?, + b'c' => parse_skipping_duplicates(&mut connection, &line, Connection::parse)?, // Parse bandwidth lines: // - Can exist not at all, once or multiple times @@ -623,19 +620,14 @@ fn parse_rejecting_duplicates< Ok(()) } -fn parse_skipping_duplicates< - T, - E: Fn(usize) -> ParserError, - P: Fn(&Line) -> Result, ->( +fn parse_skipping_duplicates Result>( value: &mut Option, line: &Line<'_>, - duplicate_error_fn: E, parser: P, ) -> Result<(), ParserError> { if value.is_some() { let _ = parser(line)?; - return Ok(()) + return Ok(()); } *value = Some(parser(line)?); Ok(())