Skip to main content

mist_parser/parser/items/
enums.rs

1use crate::{
2    Rule,
3    ast::*,
4    error::{AstError, IntoErr, collect_recovered},
5};
6
7impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for EnumItem {
8    type Error = AstError<'a, Self>;
9
10    fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result<Self, Self::Error> {
11        let rule = pair.as_rule();
12        let mut inner = pair.clone().into_inner();
13
14        match rule {
15            Rule::enum_named => Ok(EnumItem::Named(inner.next().unwrap().try_into().get()?)),
16
17            Rule::enum_tuple => Ok(EnumItem::Tuple(
18                inner.next().unwrap().try_into().get()?,
19                collect_recovered(inner.next().unwrap().into_inner()).get()?,
20            )),
21
22            Rule::enum_struct => Ok(EnumItem::Struct(
23                inner.next().unwrap().try_into().get()?,
24                inner
25                    .next()
26                    .map(|pair| collect_recovered::<FieldDecl, FieldDecl>(pair.into_inner()))
27                    .transpose()
28                    .get()?
29                    .unwrap_or_default(),
30            )),
31
32            _ => AstError::bug_unimplemented(pair),
33        }
34    }
35}