#[derive(Debug, Clone, PartialEq)] pub struct Representation { val: String, } impl Representation { pub fn new(from: &str) -> Self { Self { val: from.to_string(), } } pub(crate) fn from_choice( choice_parser_reps: &mut impl Iterator, ) -> Self { let mut buf = String::new(); let mut iter = choice_parser_reps.peekable(); loop { let rep = match iter.next() { Some(r) => r, None => break, }; buf.push_str(&rep.val); match iter.peek() { Some(_) => { buf.push_str(" | "); } None => { break; } } } Representation::new(&buf) } pub(crate) fn from_sequence( sequence_representations: &mut impl Iterator, ) -> Self { let mut buf = String::new(); let mut iter = sequence_representations.peekable(); loop { let rep = match iter.next() { Some(r) => r, None => break, }; buf.push_str(&rep.val); match iter.peek() { Some(_) => { buf.push_str(" "); } None => { break; } } } Representation::new(&buf) } // TODO use at_least, at_most pub(crate) fn repeated(underlying: Representation, at_least: u16, _at_most: u16) -> Self { let sigil = if at_least == 0 { "*" } else { "+" }; Representation::new(&format!("({}){}", underlying.val, sigil)) } }