67 lines
1.7 KiB
Rust
67 lines
1.7 KiB
Rust
#[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<Item = Representation>,
|
|
) -> 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<Item = Representation>,
|
|
) -> 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))
|
|
}
|
|
}
|