mist_parser/parser/items/
impl_decl.rs1use crate::{
2 Rule,
3 ast::*,
4 error::{AstError, IntoErr, collect_recovered},
5 parser::consume_rule,
6};
7
8impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for ImplDecl {
9 type Error = AstError<'a, Self>;
10
11 fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result<Self, Self::Error> {
12 let rule = pair.as_rule();
13 let mut inner = pair.clone().into_inner();
14
15 match rule {
16 Rule::impl_for_decl => Ok(ImplDecl {
17 generics: consume_rule(&mut inner, Rule::generics)
18 .map(Generics::try_from)
19 .transpose()
20 .get()?
21 .unwrap_or_default(),
22 trait_: Some(inner.next().unwrap().try_into().get()?),
23 target: inner.next().unwrap().try_into().get()?,
24 methods: collect_recovered(inner).get()?,
25 }),
26
27 Rule::impl_decl => Ok(ImplDecl {
28 generics: consume_rule(&mut inner, Rule::generics)
29 .map(Generics::try_from)
30 .transpose()
31 .get()?
32 .unwrap_or_default(),
33 trait_: None,
34 target: inner.next().unwrap().try_into().get()?,
35 methods: collect_recovered(inner).get()?,
36 }),
37
38 _ => AstError::bug_unimplemented(pair),
39 }
40 }
41}