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 SyntaxAttribute,
39 SyntaxBoolean,
40 SyntaxComment,
41 SyntaxCommentDoc,
42 SyntaxConstant,
43 SyntaxConstructor,
44 SyntaxEmbedded,
45 SyntaxEmphasis,
46 SyntaxEmphasisStrong,
47 SyntaxEnum,
48 SyntaxFunction,
49 SyntaxHint,
50 SyntaxKeyword,
51 SyntaxLabel,
52 SyntaxLinkText,
53 SyntaxLinkUri,
54 SyntaxNumber,
55 SyntaxOperator,
56 SyntaxPredictive,
57 SyntaxPreproc,
58 SyntaxPrimary,
59 SyntaxProperty,
60 SyntaxPunctuation,
61 SyntaxPunctuationBracket,
62 SyntaxPunctuationDelimiter,
63 SyntaxPunctuationListMarker,
64 SyntaxPunctuationSpecial,
65 SyntaxString,
66 SyntaxStringEscape,
67 SyntaxStringRegex,
68 SyntaxStringSpecial,
69 SyntaxStringSpecialSymbol,
70 SyntaxTag,
71 SyntaxTextLiteral,
72 SyntaxTitle,
73 SyntaxType,
74 SyntaxVariable,
75 SyntaxVariableSpecial,
76 SyntaxVariant,
77}
78
79impl std::fmt::Display for ZedSyntaxToken {
80 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
81 use ZedSyntaxToken::*;
82
83 write!(
84 f,
85 "{}",
86 match self {
87 SyntaxAttribute => "attribute",
88 SyntaxBoolean => "boolean",
89 SyntaxComment => "comment",
90 SyntaxCommentDoc => "comment.doc",
91 SyntaxConstant => "constant",
92 SyntaxConstructor => "constructor",
93 SyntaxEmbedded => "embedded",
94 SyntaxEmphasis => "emphasis",
95 SyntaxEmphasisStrong => "emphasis.strong",
96 SyntaxEnum => "enum",
97 SyntaxFunction => "function",
98 SyntaxHint => "hint",
99 SyntaxKeyword => "keyword",
100 SyntaxLabel => "label",
101 SyntaxLinkText => "link_text",
102 SyntaxLinkUri => "link_uri",
103 SyntaxNumber => "number",
104 SyntaxOperator => "operator",
105 SyntaxPredictive => "predictive",
106 SyntaxPreproc => "preproc",
107 SyntaxPrimary => "primary",
108 SyntaxProperty => "property",
109 SyntaxPunctuation => "punctuation",
110 SyntaxPunctuationBracket => "punctuation.bracket",
111 SyntaxPunctuationDelimiter => "punctuation.delimiter",
112 SyntaxPunctuationListMarker => "punctuation.list_marker",
113 SyntaxPunctuationSpecial => "punctuation.special",
114 SyntaxString => "string",
115 SyntaxStringEscape => "string.escape",
116 SyntaxStringRegex => "string.regex",
117 SyntaxStringSpecial => "string.special",
118 SyntaxStringSpecialSymbol => "string.special.symbol",
119 SyntaxTag => "tag",
120 SyntaxTextLiteral => "text.literal",
121 SyntaxTitle => "title",
122 SyntaxType => "type",
123 SyntaxVariable => "variable",
124 SyntaxVariableSpecial => "variable.special",
125 SyntaxVariant => "variant",
126 }
127 )
128 }
129}
130
131impl ZedSyntaxToken {
132 pub fn to_vscode(&self) -> Vec<&'static str> {
133 use ZedSyntaxToken::*;
134
135 match self {
136 SyntaxAttribute => vec!["entity.other.attribute-name"],
137 SyntaxBoolean => vec!["constant.language"],
138 SyntaxComment => vec!["comment"],
139 SyntaxCommentDoc => vec!["comment.block.documentation"],
140 SyntaxConstant => vec!["constant.character"],
141 SyntaxConstructor => vec!["entity.name.function.definition.special.constructor"],
142 SyntaxEmbedded => vec!["meta.embedded"],
143 SyntaxEmphasis => vec!["markup.italic"],
144 SyntaxEmphasisStrong => vec![
145 "markup.bold",
146 "markup.italic markup.bold",
147 "markup.bold markup.italic",
148 ],
149 SyntaxEnum => vec!["support.type.enum"],
150 SyntaxFunction => vec![
151 "entity.name.function",
152 "variable.function",
153 "support.function",
154 ],
155 SyntaxKeyword => vec!["keyword"],
156 SyntaxLabel => vec![
157 "label",
158 "entity.name",
159 "entity.name.import",
160 "entity.name.package",
161 ],
162 SyntaxLinkText => vec!["markup.underline.link", "string.other.link"],
163 SyntaxLinkUri => vec!["markup.underline.link", "string.other.link"],
164 SyntaxNumber => vec!["constant.numeric", "number"],
165 SyntaxOperator => vec!["operator", "keyword.operator"],
166 SyntaxPreproc => vec!["preproc"],
167 SyntaxProperty => vec![
168 "variable.member",
169 "support.type.property-name",
170 "variable.object.property",
171 "variable.other.field",
172 ],
173 SyntaxPunctuation => vec![
174 "punctuation",
175 "punctuation.section",
176 "punctuation.accessor",
177 "punctuation.separator",
178 "punctuation.terminator",
179 "punctuation.definition.tag",
180 ],
181 SyntaxPunctuationBracket => vec![
182 "punctuation.bracket",
183 "punctuation.definition.tag.begin",
184 "punctuation.definition.tag.end",
185 ],
186 SyntaxPunctuationDelimiter => vec![
187 "punctuation.delimiter",
188 "punctuation.separator",
189 "punctuation.terminator",
190 ],
191 SyntaxPunctuationListMarker => vec!["markup.list punctuation.definition.list.begin"],
192 SyntaxPunctuationSpecial => vec!["punctuation.special"],
193 SyntaxString => vec!["string"],
194 SyntaxStringEscape => vec!["string.escape", "constant.character", "constant.other"],
195 SyntaxStringRegex => vec!["string.regex"],
196 SyntaxStringSpecial => vec!["string.special", "constant.other.symbol"],
197 SyntaxStringSpecialSymbol => vec!["string.special.symbol", "constant.other.symbol"],
198 SyntaxTag => vec!["tag", "entity.name.tag", "meta.tag.sgml"],
199 SyntaxTextLiteral => vec!["text.literal", "string"],
200 SyntaxTitle => vec!["title", "entity.name"],
201 SyntaxType => vec!["entity.name.type", "support.type", "support.class"],
202 SyntaxVariable => vec![
203 "variable",
204 "variable.language",
205 "variable.member",
206 "variable.parameter.function-call",
207 ],
208 SyntaxVariableSpecial => vec![
209 "variable.special",
210 "variable.member",
211 "variable.annotation",
212 "variable.language",
213 ],
214 SyntaxVariant => vec!["variant"],
215 _ => vec![],
216 }
217 }
218}