aldrin_parser/ast/
definition.rs1use 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}