oak_dockerfile/lexer/
token_type.rs1use 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}