Skip to main content

oak_dockerfile/kind/
mod.rs

1pub type DockerfileToken = Token<DockerfileSyntaxKind>;
2
3/// Dockerfile 语法种类
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize)]
5pub enum DockerfileSyntaxKind {
6    // 基本 kind
7    Identifier,
8    String,
9    Number,
10    Whitespace,
11    Newline,
12
13    // Dockerfile 指令
14    From,
15    Run,
16    Cmd,
17    Label,
18    Maintainer,
19    Expose,
20    Env,
21    Add,
22    Copy,
23    Entrypoint,
24    Volume,
25    User,
26    Workdir,
27    Arg,
28    Onbuild,
29    Stopsignal,
30    Healthcheck,
31    Shell,
32
33    // 特殊关键
34    As,
35    None,
36    Interval,
37    Timeout,
38    StartPeriod,
39    Retries,
40
41    // 操作符和分隔符
42    Equal,        // = (保持向后兼容)
43    Equals,       // = (新名称)
44    Colon,        // :
45    Comma,        // ,
46    Semicolon,    // ;
47    Dollar,       // $
48    LeftBracket,  // [
49    RightBracket, // ]
50    LeftBrace,    // {
51    RightBrace,   // }
52    LeftParen,    // (
53    RightParen,   // )
54
55    // 注释
56    Comment,
57
58    // 路径和文件名
59    Path,
60
61    // 特殊
62    Root,
63    Statement,
64    Error,
65    Eof,
66}
67
68impl DockerfileSyntaxKind {
69    pub fn is_instruction(&self) -> bool {
70        matches!(
71            self,
72            Self::From
73                | Self::Run
74                | Self::Cmd
75                | Self::Label
76                | Self::Maintainer
77                | Self::Expose
78                | Self::Env
79                | Self::Add
80                | Self::Copy
81                | Self::Entrypoint
82                | Self::Volume
83                | Self::User
84                | Self::Workdir
85                | Self::Arg
86                | Self::Onbuild
87                | Self::Stopsignal
88                | Self::Healthcheck
89                | Self::Shell
90        )
91    }
92
93    pub fn is_trivia(&self) -> bool {
94        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
95    }
96}
97
98use oak_core::{ElementType, Token, TokenType, UniversalElementRole, UniversalTokenRole};
99
100impl TokenType for DockerfileSyntaxKind {
101    const END_OF_STREAM: Self = Self::Eof;
102    type Role = UniversalTokenRole;
103
104    fn role(&self) -> Self::Role {
105        match self {
106            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
107            Self::Comment => UniversalTokenRole::Comment,
108            Self::Eof => UniversalTokenRole::Eof,
109            Self::Error => UniversalTokenRole::Error,
110            Self::From
111            | Self::Run
112            | Self::Cmd
113            | Self::Label
114            | Self::Maintainer
115            | Self::Expose
116            | Self::Env
117            | Self::Add
118            | Self::Copy
119            | Self::Entrypoint
120            | Self::Volume
121            | Self::User
122            | Self::Workdir
123            | Self::Arg
124            | Self::Onbuild
125            | Self::Stopsignal
126            | Self::Healthcheck
127            | Self::Shell => UniversalTokenRole::Keyword,
128            Self::Identifier => UniversalTokenRole::Name,
129            Self::String => UniversalTokenRole::Literal,
130            Self::Number => UniversalTokenRole::Literal,
131            _ => UniversalTokenRole::None,
132        }
133    }
134}
135
136impl ElementType for DockerfileSyntaxKind {
137    type Role = UniversalElementRole;
138
139    fn role(&self) -> Self::Role {
140        match self {
141            Self::Root => UniversalElementRole::Root,
142            Self::Statement => UniversalElementRole::Statement,
143            Self::Error => UniversalElementRole::Error,
144            _ => UniversalElementRole::None,
145        }
146    }
147}