syntax.rs

  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}