aldrin_parser/ast/
definition.rs

1use 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}