From fd43d94f9d52237f2ee5a5f518f852fde74caf01 Mon Sep 17 00:00:00 2001 From: Zollerboy1 Date: Wed, 4 Feb 2026 00:19:00 +0100 Subject: [PATCH] Implement ConfigParser for OneOf --- src/primitive.rs | 50 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/src/primitive.rs b/src/primitive.rs index 4d854f25..aecf3fcb 100644 --- a/src/primitive.rs +++ b/src/primitive.rs @@ -211,6 +211,27 @@ where } } +/// Configuration for [`one_of`], used in [`ConfigParser::configure`] +pub struct OneOfCfg { + seq: Option, +} + +impl OneOfCfg { + /// Set the sequence to be used while parsing + #[inline] + pub fn seq(mut self, new_seq: T) -> Self { + self.seq = Some(new_seq); + self + } +} + +impl Default for OneOfCfg { + #[inline] + fn default() -> Self { + OneOfCfg { seq: None } + } +} + /// See [`one_of`]. pub struct OneOf { seq: T, @@ -272,16 +293,37 @@ where #[inline] fn go(&self, inp: &mut InputRef<'src, '_, I, E>) -> PResult { + Self::go_cfg::(self, inp, OneOfCfg::default()) + } + + go_extra!(I::Token); +} + +impl<'src, I, E, T> ConfigParser<'src, I, I::Token, E> for OneOf +where + I: ValueInput<'src>, + E: ParserExtra<'src, I>, + I::Token: PartialEq, + T: Seq<'src, I::Token>, +{ + type Config = OneOfCfg; + + #[inline] + fn go_cfg( + &self, + inp: &mut InputRef<'src, '_, I, E>, + cfg: Self::Config, + ) -> PResult { + let seq = cfg.seq.as_ref().unwrap_or(&self.seq); let before = inp.save(); match inp.next_inner() { #[allow(suspicious_double_ref_op)] // Is this a clippy bug? - Some(tok) if self.seq.contains(tok.borrow()) => Ok(M::bind(|| tok)), + Some(tok) if seq.contains(tok.borrow()) => Ok(M::bind(|| tok)), found => { let err_span = inp.span_since(before.cursor()); inp.rewind(before); inp.add_alt( - self.seq - .seq_iter() + seq.seq_iter() .map(|e| DefaultExpected::Token(T::to_maybe_ref(e))), found.map(|f| f.into()), err_span, @@ -290,8 +332,6 @@ where } } } - - go_extra!(I::Token); } /// See [`none_of`].