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
11#[derive(Debug, Deserialize)]
12pub struct VsCodeTokenColor {
13 pub scope: Option<VsCodeTokenScope>,
14 pub settings: VsCodeTokenColorSettings,
15}
16
17#[derive(Debug, Deserialize)]
18pub struct VsCodeTokenColorSettings {
19 pub foreground: Option<String>,
20 pub background: Option<String>,
21 #[serde(rename = "fontStyle")]
22 pub font_style: Option<String>,
23}
24
25#[derive(Debug, PartialEq, Copy, Clone, EnumIter)]
26pub enum ZedSyntaxToken {
27 SyntaxAttribute,
28 SyntaxBoolean,
29 SyntaxComment,
30 SyntaxCommentDoc,
31 SyntaxConstant,
32 SyntaxConstructor,
33 SyntaxEmbedded,
34 SyntaxEmphasis,
35 SyntaxEmphasisStrong,
36 SyntaxEnum,
37 SyntaxFunction,
38 SyntaxHint,
39 SyntaxKeyword,
40 SyntaxLabel,
41 SyntaxLinkText,
42 SyntaxLinkUri,
43 SyntaxNumber,
44 SyntaxOperator,
45 SyntaxPredictive,
46 SyntaxPreproc,
47 SyntaxPrimary,
48 SyntaxProperty,
49 SyntaxPunctuation,
50 SyntaxPunctuationBracket,
51 SyntaxPunctuationDelimiter,
52 SyntaxPunctuationListMarker,
53 SyntaxPunctuationSpecial,
54 SyntaxString,
55 SyntaxStringEscape,
56 SyntaxStringRegex,
57 SyntaxStringSpecial,
58 SyntaxStringSpecialSymbol,
59 SyntaxTag,
60 SyntaxTextLiteral,
61 SyntaxTitle,
62 SyntaxType,
63 SyntaxVariable,
64 SyntaxVariableSpecial,
65 SyntaxVariant,
66}
67
68impl std::fmt::Display for ZedSyntaxToken {
69 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70 use ZedSyntaxToken::*;
71
72 write!(
73 f,
74 "{}",
75 match self {
76 SyntaxAttribute => "attribute",
77 SyntaxBoolean => "boolean",
78 SyntaxComment => "comment",
79 SyntaxCommentDoc => "comment.doc",
80 SyntaxConstant => "constant",
81 SyntaxConstructor => "constructor",
82 SyntaxEmbedded => "embedded",
83 SyntaxEmphasis => "emphasis",
84 SyntaxEmphasisStrong => "emphasis.strong",
85 SyntaxEnum => "enum",
86 SyntaxFunction => "function",
87 SyntaxHint => "hint",
88 SyntaxKeyword => "keyword",
89 SyntaxLabel => "label",
90 SyntaxLinkText => "link_text",
91 SyntaxLinkUri => "link_uri",
92 SyntaxNumber => "number",
93 SyntaxOperator => "operator",
94 SyntaxPredictive => "predictive",
95 SyntaxPreproc => "preproc",
96 SyntaxPrimary => "primary",
97 SyntaxProperty => "property",
98 SyntaxPunctuation => "punctuation",
99 SyntaxPunctuationBracket => "punctuation.bracket",
100 SyntaxPunctuationDelimiter => "punctuation.delimiter",
101 SyntaxPunctuationListMarker => "punctuation.list_marker",
102 SyntaxPunctuationSpecial => "punctuation.special",
103 SyntaxString => "string",
104 SyntaxStringEscape => "string.escape",
105 SyntaxStringRegex => "string.regex",
106 SyntaxStringSpecial => "string.special",
107 SyntaxStringSpecialSymbol => "string.special.symbol",
108 SyntaxTag => "tag",
109 SyntaxTextLiteral => "text.literal",
110 SyntaxTitle => "title",
111 SyntaxType => "type",
112 SyntaxVariable => "variable",
113 SyntaxVariableSpecial => "variable.special",
114 SyntaxVariant => "variant",
115 }
116 )
117 }
118}
119
120impl ZedSyntaxToken {
121 pub fn to_vscode(&self) -> &'static str {
122 use ZedSyntaxToken::*;
123
124 match self {
125 SyntaxAttribute => "entity.other.attribute-name",
126 SyntaxBoolean => "constant.language",
127 SyntaxComment => "comment",
128 SyntaxCommentDoc => "comment.block.documentation",
129 SyntaxConstant => "constant.character",
130 SyntaxConstructor => "entity.name.function.definition.special.constructor",
131 SyntaxEmbedded => "embedded",
132 SyntaxEmphasis => "emphasis",
133 SyntaxEmphasisStrong => "emphasis.strong",
134 SyntaxEnum => "support.type.enum",
135 SyntaxFunction => "entity.name.function",
136 SyntaxHint => "hint",
137 SyntaxKeyword => "keyword",
138 SyntaxLabel => "label",
139 SyntaxLinkText => "link_text",
140 SyntaxLinkUri => "link_uri",
141 SyntaxNumber => "number",
142 SyntaxOperator => "operator",
143 SyntaxPredictive => "predictive",
144 SyntaxPreproc => "preproc",
145 SyntaxPrimary => "primary",
146 SyntaxProperty => "variable.object.property", //"variable.other.field"
147 SyntaxPunctuation => "punctuation",
148 SyntaxPunctuationBracket => "punctuation.bracket",
149 SyntaxPunctuationDelimiter => "punctuation.delimiter",
150 SyntaxPunctuationListMarker => "punctuation.list_marker",
151 SyntaxPunctuationSpecial => "punctuation.special",
152 SyntaxString => "string",
153 SyntaxStringEscape => "string.escape",
154 SyntaxStringRegex => "string.regex",
155 SyntaxStringSpecial => "string.special",
156 SyntaxStringSpecialSymbol => "string.special.symbol",
157 SyntaxTag => "tag",
158 SyntaxTextLiteral => "text.literal",
159 SyntaxTitle => "title",
160 SyntaxType => "entity.name.type",
161 SyntaxVariable => "variable.language",
162 SyntaxVariableSpecial => "variable.special",
163 SyntaxVariant => "variant",
164 }
165 }
166}