Skip to main content

aldrin_parser/ast/
definition.rs

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