From a8ff2c50afcff47afae04faa3de820b8c76d32b8 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Fri, 3 Apr 2026 17:12:30 +0100 Subject: [PATCH] option_parser: Introduce parse_subset() tolerating unknown options Refactor parse() into a version that can control whether to tolerate unknown options. This can then be used to then parse a subset of the options. Signed-off-by: Rob Bradford --- option_parser/src/lib.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/option_parser/src/lib.rs b/option_parser/src/lib.rs index 699a26252..72b9783de 100644 --- a/option_parser/src/lib.rs +++ b/option_parser/src/lib.rs @@ -93,7 +93,7 @@ impl OptionParser { } } - pub fn parse(&mut self, input: &str) -> OptionParserResult<()> { + fn parse_inner(&mut self, input: &str, ignore_unknown: bool) -> OptionParserResult<()> { if input.trim().is_empty() { return Ok(()); } @@ -101,7 +101,11 @@ impl OptionParser { for option in split_commas(input)?.iter() { let parts: Vec<&str> = option.splitn(2, '=').collect(); match self.options.get_mut(parts[0]) { - None => return Err(OptionParserError::UnknownOption(parts[0].to_owned())), + None => { + if !ignore_unknown { + return Err(OptionParserError::UnknownOption(parts[0].to_owned())); + } + } Some(value) => { if value.requires_value { if parts.len() != 2 { @@ -118,6 +122,14 @@ impl OptionParser { Ok(()) } + pub fn parse(&mut self, input: &str) -> OptionParserResult<()> { + self.parse_inner(input, false) + } + + pub fn parse_subset(&mut self, input: &str) -> OptionParserResult<()> { + self.parse_inner(input, true) + } + pub fn add(&mut self, option: &str) -> &mut Self { // Check that option=value has balanced // quotes and brackets iff value does.