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    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}