Skip to main content

oak_dockerfile/lexer/
token_type.rs

1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5pub type DockerfileToken = Token<DockerfileTokenType>;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub enum DockerfileTokenType {
10    Identifier,
11    String,
12    Number,
13    Whitespace,
14    Newline,
15    From,
16    Run,
17    Cmd,
18    Label,
19    Maintainer,
20    Expose,
21    Env,
22    Add,
23    Copy,
24    Entrypoint,
25    Volume,
26    User,
27    Workdir,
28    Arg,
29    Onbuild,
30    Stopsignal,
31    Healthcheck,
32    Shell,
33    As,
34    None,
35    Interval,
36    Timeout,
37    StartPeriod,
38    Retries,
39    Equal,
40    Equals,
41    Colon,
42    Comma,
43    Semicolon,
44    Dollar,
45    LeftBracket,
46    RightBracket,
47    LeftBrace,
48    RightBrace,
49    LeftParen,
50    RightParen,
51    Comment,
52    Path,
53    Root,
54    Statement,
55    Error,
56    Eof,
57}
58
59impl DockerfileTokenType {
60    pub fn is_instruction(&self) -> bool {
61        matches!(
62            self,
63            Self::From
64                | Self::Run
65                | Self::Cmd
66                | Self::Label
67                | Self::Maintainer
68                | Self::Expose
69                | Self::Env
70                | Self::Add
71                | Self::Copy
72                | Self::Entrypoint
73                | Self::Volume
74                | Self::User
75                | Self::Workdir
76                | Self::Arg
77                | Self::Onbuild
78                | Self::Stopsignal
79                | Self::Healthcheck
80                | Self::Shell
81        )
82    }
83
84    pub fn is_trivia(&self) -> bool {
85        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
86    }
87}
88
89impl TokenType for DockerfileTokenType {
90    type Role = UniversalTokenRole;
91    const END_OF_STREAM: Self = Self::Eof;
92
93    fn is_ignored(&self) -> bool {
94        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
95    }
96
97    fn role(&self) -> Self::Role {
98        match self {
99            Self::Whitespace => UniversalTokenRole::Whitespace,
100            Self::Newline => UniversalTokenRole::Whitespace,
101            Self::Comment => UniversalTokenRole::Comment,
102            Self::Eof => UniversalTokenRole::Eof,
103            Self::Error => UniversalTokenRole::Error,
104            _ => UniversalTokenRole::None,
105        }
106    }
107}