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