Skip to main content

chatty_rs/app/ui/
syntaxes.rs

1use once_cell::sync::Lazy;
2use ratatui::style::Color;
3use syntect::parsing::{SyntaxReference, SyntaxSet};
4
5pub static SYNTAX_SET: Lazy<SyntaxSet> = Lazy::new(Syntaxes::load);
6
7pub struct Syntaxes;
8
9impl Syntaxes {
10    fn load() -> SyntaxSet {
11        SyntaxSet::load_defaults_newlines()
12    }
13
14    pub fn get(name: &str) -> &SyntaxReference {
15        if let Some(syntax) = SYNTAX_SET.find_syntax_by_extension(name) {
16            return syntax;
17        }
18
19        if let Some(syntax) = SYNTAX_SET.find_syntax_by_name(name) {
20            return syntax;
21        }
22
23        if let Some(syntax) = SYNTAX_SET.find_syntax_by_token(name) {
24            return syntax;
25        }
26
27        SYNTAX_SET.find_syntax_plain_text()
28    }
29
30    pub fn list() -> Vec<String> {
31        let mut list = SYNTAX_SET
32            .syntaxes()
33            .iter()
34            .map(|s| s.name.clone())
35            .collect::<Vec<String>>();
36        list.sort();
37        list
38    }
39
40    pub fn translate_colour(synntect_color: syntect::highlighting::Color) -> Option<Color> {
41        let syntect::highlighting::Color { r, g, b, .. } = synntect_color;
42        Some(Color::Rgb(r, g, b))
43    }
44}