mist_parser/parser/items/
enums.rs1use 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}