Skip to main content

mist_parser/parser/items/
impl_decl.rs

1use 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}