aldrin_parser/ast/
definition.rs1use crate::ast::{ConstDef, EnumDef, Ident, 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}
15
16impl Definition {
17 pub(crate) fn parse(pair: Pair<Rule>) -> Self {
18 assert_eq!(pair.as_rule(), Rule::def);
19 let mut pairs = pair.into_inner();
20 let pair = pairs.next().unwrap();
21 match pair.as_rule() {
22 Rule::struct_def => Self::Struct(StructDef::parse(pair)),
23 Rule::enum_def => Self::Enum(EnumDef::parse(pair)),
24 Rule::service_def => Self::Service(ServiceDef::parse(pair)),
25 Rule::const_def => Self::Const(ConstDef::parse(pair)),
26 _ => unreachable!(),
27 }
28 }
29
30 pub(crate) fn validate(&self, validate: &mut Validate) {
31 match self {
32 Self::Struct(d) => d.validate(validate),
33 Self::Enum(d) => d.validate(validate),
34 Self::Service(d) => d.validate(validate),
35 Self::Const(d) => d.validate(validate),
36 }
37 }
38
39 pub fn span(&self) -> Span {
40 match self {
41 Self::Struct(d) => d.span(),
42 Self::Enum(d) => d.span(),
43 Self::Service(d) => d.span(),
44 Self::Const(d) => d.span(),
45 }
46 }
47
48 pub fn name(&self) -> &Ident {
49 match self {
50 Self::Struct(d) => d.name(),
51 Self::Enum(d) => d.name(),
52 Self::Service(d) => d.name(),
53 Self::Const(d) => d.name(),
54 }
55 }
56
57 pub fn as_struct(&self) -> Option<&StructDef> {
58 match self {
59 Self::Struct(d) => Some(d),
60 _ => None,
61 }
62 }
63
64 pub fn as_enum(&self) -> Option<&EnumDef> {
65 match self {
66 Self::Enum(d) => Some(d),
67 _ => None,
68 }
69 }
70
71 pub fn as_service(&self) -> Option<&ServiceDef> {
72 match self {
73 Self::Service(d) => Some(d),
74 _ => None,
75 }
76 }
77
78 pub fn as_const(&self) -> Option<&ConstDef> {
79 match self {
80 Self::Const(d) => Some(d),
81 _ => None,
82 }
83 }
84}