1use serde::Deserialize;
2use strum::EnumIter;
3
4#[derive(Debug, Deserialize)]
5#[serde(untagged)]
6pub enum VsCodeTokenScope {
7 One(String),
8 Many(Vec<String>),
9}
10
11impl VsCodeTokenScope {
12 pub fn multimatch(&self, matches: &[&'static str]) -> bool {
13 match self {
14 VsCodeTokenScope::One(scope) => matches.iter().any(|&s| s == scope),
15 VsCodeTokenScope::Many(scopes) => {
16 matches.iter().any(|s| scopes.contains(&s.to_string()))
17 }
18 }
19 }
20}
21
22#[derive(Debug, Deserialize)]
23pub struct VsCodeTokenColor {
24 pub scope: Option<VsCodeTokenScope>,
25 pub settings: VsCodeTokenColorSettings,
26}
27
28#[derive(Debug, Deserialize)]
29pub struct VsCodeTokenColorSettings {
30 pub foreground: Option<String>,
31 pub background: Option<String>,
32 #[serde(rename = "fontStyle")]
33 pub font_style: Option<String>,
34}
35
36#[derive(Debug, PartialEq, Copy, Clone, EnumIter)]
37pub enum ZedSyntaxToken {
38 Attribute,
39 Boolean,
40 Comment,
41 CommentDoc,
42 Constant,
43 Constructor,
44 Embedded,
45 Emphasis,
46 EmphasisStrong,
47 Enum,
48 Function,
49 Hint,
50 Keyword,
51 Label,
52 LinkText,
53 LinkUri,
54 Number,
55 Operator,
56 Predictive,
57 Preproc,
58 Primary,
59 Property,
60 Punctuation,
61 PunctuationBracket,
62 PunctuationDelimiter,
63 PunctuationListMarker,
64 PunctuationSpecial,
65 String,
66 StringEscape,
67 StringRegex,
68 StringSpecial,
69 StringSpecialSymbol,
70 Tag,
71 TextLiteral,
72 Title,
73 Type,
74 Variable,
75 VariableSpecial,
76 Variant,
77}
78
79impl std::fmt::Display for ZedSyntaxToken {
80 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
81 write!(
82 f,
83 "{}",
84 match self {
85 ZedSyntaxToken::Attribute => "attribute",
86 ZedSyntaxToken::Boolean => "boolean",
87 ZedSyntaxToken::Comment => "comment",
88 ZedSyntaxToken::CommentDoc => "comment.doc",
89 ZedSyntaxToken::Constant => "constant",
90 ZedSyntaxToken::Constructor => "constructor",
91 ZedSyntaxToken::Embedded => "embedded",
92 ZedSyntaxToken::Emphasis => "emphasis",
93 ZedSyntaxToken::EmphasisStrong => "emphasis.strong",
94 ZedSyntaxToken::Enum => "enum",
95 ZedSyntaxToken::Function => "function",
96 ZedSyntaxToken::Hint => "hint",
97 ZedSyntaxToken::Keyword => "keyword",
98 ZedSyntaxToken::Label => "label",
99 ZedSyntaxToken::LinkText => "link_text",
100 ZedSyntaxToken::LinkUri => "link_uri",
101 ZedSyntaxToken::Number => "number",
102 ZedSyntaxToken::Operator => "operator",
103 ZedSyntaxToken::Predictive => "predictive",
104 ZedSyntaxToken::Preproc => "preproc",
105 ZedSyntaxToken::Primary => "primary",
106 ZedSyntaxToken::Property => "property",
107 ZedSyntaxToken::Punctuation => "punctuation",
108 ZedSyntaxToken::PunctuationBracket => "punctuation.bracket",
109 ZedSyntaxToken::PunctuationDelimiter => "punctuation.delimiter",
110 ZedSyntaxToken::PunctuationListMarker => "punctuation.list_marker",
111 ZedSyntaxToken::PunctuationSpecial => "punctuation.special",
112 ZedSyntaxToken::String => "string",
113 ZedSyntaxToken::StringEscape => "string.escape",
114 ZedSyntaxToken::StringRegex => "string.regex",
115 ZedSyntaxToken::StringSpecial => "string.special",
116 ZedSyntaxToken::StringSpecialSymbol => "string.special.symbol",
117 ZedSyntaxToken::Tag => "tag",
118 ZedSyntaxToken::TextLiteral => "text.literal",
119 ZedSyntaxToken::Title => "title",
120 ZedSyntaxToken::Type => "type",
121 ZedSyntaxToken::Variable => "variable",
122 ZedSyntaxToken::VariableSpecial => "variable.special",
123 ZedSyntaxToken::Variant => "variant",
124 }
125 )
126 }
127}
128
129impl ZedSyntaxToken {
130 pub fn to_vscode(&self) -> Vec<&'static str> {
131 match self {
132 ZedSyntaxToken::Attribute => vec!["entity.other.attribute-name"],
133 ZedSyntaxToken::Boolean => vec!["constant.language"],
134 ZedSyntaxToken::Comment => vec!["comment"],
135 ZedSyntaxToken::CommentDoc => vec!["comment.block.documentation"],
136 ZedSyntaxToken::Constant => vec!["constant.character"],
137 ZedSyntaxToken::Constructor => {
138 vec!["entity.name.function.definition.special.constructor"]
139 }
140 ZedSyntaxToken::Embedded => vec!["meta.embedded"],
141 ZedSyntaxToken::Emphasis => vec!["markup.italic"],
142 ZedSyntaxToken::EmphasisStrong => vec![
143 "markup.bold",
144 "markup.italic markup.bold",
145 "markup.bold markup.italic",
146 ],
147 ZedSyntaxToken::Enum => vec!["support.type.enum"],
148 ZedSyntaxToken::Function => vec![
149 "entity.name.function",
150 "variable.function",
151 "support.function",
152 ],
153 ZedSyntaxToken::Keyword => vec!["keyword"],
154 ZedSyntaxToken::Label => vec![
155 "label",
156 "entity.name",
157 "entity.name.import",
158 "entity.name.package",
159 ],
160 ZedSyntaxToken::LinkText => vec!["markup.underline.link", "string.other.link"],
161 ZedSyntaxToken::LinkUri => vec!["markup.underline.link", "string.other.link"],
162 ZedSyntaxToken::Number => vec!["constant.numeric", "number"],
163 ZedSyntaxToken::Operator => vec!["operator", "keyword.operator"],
164 ZedSyntaxToken::Preproc => vec!["preproc"],
165 ZedSyntaxToken::Property => vec![
166 "variable.member",
167 "support.type.property-name",
168 "variable.object.property",
169 "variable.other.field",
170 ],
171 ZedSyntaxToken::Punctuation => vec![
172 "punctuation",
173 "punctuation.section",
174 "punctuation.accessor",
175 "punctuation.separator",
176 "punctuation.terminator",
177 "punctuation.definition.tag",
178 ],
179 ZedSyntaxToken::PunctuationBracket => vec![
180 "punctuation.bracket",
181 "punctuation.definition.tag.begin",
182 "punctuation.definition.tag.end",
183 ],
184 ZedSyntaxToken::PunctuationDelimiter => vec![
185 "punctuation.delimiter",
186 "punctuation.separator",
187 "punctuation.terminator",
188 ],
189 ZedSyntaxToken::PunctuationListMarker => {
190 vec!["markup.list punctuation.definition.list.begin"]
191 }
192 ZedSyntaxToken::PunctuationSpecial => vec!["punctuation.special"],
193 ZedSyntaxToken::String => vec!["string"],
194 ZedSyntaxToken::StringEscape => {
195 vec!["string.escape", "constant.character", "constant.other"]
196 }
197 ZedSyntaxToken::StringRegex => vec!["string.regex"],
198 ZedSyntaxToken::StringSpecial => vec!["string.special", "constant.other.symbol"],
199 ZedSyntaxToken::StringSpecialSymbol => {
200 vec!["string.special.symbol", "constant.other.symbol"]
201 }
202 ZedSyntaxToken::Tag => vec!["tag", "entity.name.tag", "meta.tag.sgml"],
203 ZedSyntaxToken::TextLiteral => vec!["text.literal", "string"],
204 ZedSyntaxToken::Title => vec!["title", "entity.name"],
205 ZedSyntaxToken::Type => vec!["entity.name.type", "support.type", "support.class"],
206 ZedSyntaxToken::Variable => vec![
207 "variable",
208 "variable.language",
209 "variable.member",
210 "variable.parameter.function-call",
211 ],
212 ZedSyntaxToken::VariableSpecial => vec![
213 "variable.special",
214 "variable.member",
215 "variable.annotation",
216 "variable.language",
217 ],
218 ZedSyntaxToken::Variant => vec!["variant"],
219 _ => vec![],
220 }
221 }
222}