aldrin_parser/ast/
definition.rs

1use crate::ast::{ConstDef, EnumDef, Ident, NewtypeDef, ServiceDef, StructDef};
2use crate::grammar::Rule;
3use crate::validate::Validate;
4use crate::Span;
5use pest::iterators::Pair;
6
7#[derive(Debug, Clone)]
8#[allow(clippy::large_enum_variant)]
9pub enum Definition {
10    Struct(StructDef),
11    Enum(EnumDef),
12    Service(ServiceDef),
13    Const(ConstDef),
14    Newtype(NewtypeDef),
15}
16
17impl Definition {
18    pub(crate) fn parse(pair: Pair<Rule>) -> Self {
19        assert_eq!(pair.as_rule(), Rule::def);
20        let mut pairs = pair.into_inner();
21        let pair = pairs.next().unwrap();
22        match pair.as_rule() {
23            Rule::struct_def => Self::Struct(StructDef::parse(pair)),
24            Rule::enum_def => Self::Enum(EnumDef::parse(pair)),
25            Rule::service_def => Self::Service(ServiceDef::parse(pair)),
26            Rule::const_def => Self::Const(ConstDef::parse(pair)),
27            Rule::newtype_def => Self::Newtype(NewtypeDef::parse(pair)),
28            _ => unreachable!(),
29        }
30    }
31
32    pub(crate) fn validate(&self, validate: &mut Validate) {
33        match self {
34            Self::Struct(d) => d.validate(validate),
35            Self::Enum(d) => d.validate(validate),
36            Self::Service(d) => d.validate(validate),
37            Self::Const(d) => d.validate(validate),
38            Self::Newtype(d) => d.validate(validate),
39        }
40    }
41
42    pub fn span(&self) -> Span {
43        match self {
44            Self::Struct(d) => d.span(),
45            Self::Enum(d) => d.span(),
46            Self::Service(d) => d.span(),
47            Self::Const(d) => d.span(),
48            Self::Newtype(d) => d.span(),
49        }
50    }
51
52    pub fn name(&self) -> &Ident {
53        match self {
54            Self::Struct(d) => d.name(),
55            Self::Enum(d) => d.name(),
56            Self::Service(d) => d.name(),
57            Self::Const(d) => d.name(),
58            Self::Newtype(d) => d.name(),
59        }
60    }
61
62    pub fn as_struct(&self) -> Option<&StructDef> {
63        match self {
64            Self::Struct(d) => Some(d),
65            _ => None,
66        }
67    }
68
69    pub fn as_enum(&self) -> Option<&EnumDef> {
70        match self {
71            Self::Enum(d) => Some(d),
72            _ => None,
73        }
74    }
75
76    pub fn as_service(&self) -> Option<&ServiceDef> {
77        match self {
78            Self::Service(d) => Some(d),
79            _ => None,
80        }
81    }
82
83    pub fn as_const(&self) -> Option<&ConstDef> {
84        match self {
85            Self::Const(d) => Some(d),
86            _ => None,
87        }
88    }
89
90    pub fn as_newtype(&self) -> Option<&NewtypeDef> {
91        match self {
92            Self::Newtype(d) => Some(d),
93            _ => None,
94        }
95    }
96}