Skip to main content

oak_protobuf/parser/
element_type.rs

1use oak_core::{ElementType, UniversalElementRole};
2
3/// Element types for the Protobuf language.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum ProtobufElementType {
7    /// Root node.
8    Root,
9    /// Whitespace.
10    Whitespace,
11    /// Newline.
12    Newline,
13    /// Comment.
14    Comment,
15    /// Error node.
16    Error,
17    /// End of stream.
18    Eof,
19
20    /// Syntax definition.
21    SyntaxDef,
22    /// Package definition.
23    PackageDef,
24    /// Import definition.
25    ImportDef,
26    /// Option definition.
27    OptionDef,
28    /// Message definition.
29    MessageDef,
30    /// Enum definition.
31    EnumDef,
32    /// Service definition.
33    ServiceDef,
34    /// RPC definition.
35    RpcDef,
36    /// Field definition.
37    FieldDef,
38    /// Map field definition.
39    MapFieldDef,
40    /// Oneof definition.
41    OneofDef,
42
43    /// Identifier.
44    Identifier,
45    /// String literal.
46    StringLiteral,
47    /// Number literal.
48    NumberLiteral,
49    /// Boolean literal.
50    BooleanLiteral,
51}
52
53impl ElementType for ProtobufElementType {
54    type Role = UniversalElementRole;
55
56    fn role(&self) -> Self::Role {
57        match self {
58            Self::Root => UniversalElementRole::Root,
59            _ => UniversalElementRole::None,
60        }
61    }
62}
63
64impl From<crate::lexer::token_type::ProtobufTokenType> for ProtobufElementType {
65    fn from(token: crate::lexer::token_type::ProtobufTokenType) -> Self {
66        use crate::lexer::token_type::ProtobufTokenType as T;
67        match token {
68            T::Whitespace => Self::Whitespace,
69            T::Newline => Self::Newline,
70            T::Comment => Self::Comment,
71            T::Identifier => Self::Identifier,
72            T::StringLiteral => Self::StringLiteral,
73            T::NumberLiteral => Self::NumberLiteral,
74            T::BooleanLiteral => Self::BooleanLiteral,
75            T::Error => Self::Error,
76            _ => Self::Error,
77        }
78    }
79}