1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use crate::{
item::Item,
meta_usage::{to_usage_meta, UsageMeta},
};
#[doc(hidden)]
#[derive(Clone, Debug)]
pub enum Meta {
And(Vec<Meta>),
Or(Vec<Meta>),
Optional(Box<Meta>),
Item(Item),
Many(Box<Meta>),
Decorated(Box<Meta>, &'static str),
Skip,
}
impl std::fmt::Display for Meta {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.as_usage_meta() {
Some(usage) => usage.fmt(f),
None => f.write_str("no parameters expected"),
}
}
}
impl Meta {
fn alts(self, to: &mut Vec<Meta>) {
match self {
Meta::Or(mut xs) => to.append(&mut xs),
Meta::Skip => {}
meta => to.push(meta),
}
}
pub(crate) fn or(self, other: Meta) -> Self {
let mut res = Vec::new();
self.alts(&mut res);
other.alts(&mut res);
match res.len() {
0 => Meta::Skip,
1 => res.remove(0),
_ => Meta::Or(res),
}
}
pub(crate) fn as_usage_meta(&self) -> Option<UsageMeta> {
to_usage_meta(self)
}
}