use serde::Deserialize;
use std::collections::BTreeMap;
#[derive(Debug, Deserialize)]
#[allow(dead_code)]
pub struct Language {
pub fs_name: Option<String>,
#[serde(rename = "type")]
pub kind: String,
pub aliases: Option<Vec<String>>,
pub code_mirror_mode: Option<String>,
pub code_mirror_mime_type: Option<String>,
pub wrap: Option<bool>,
pub extensions: Option<Vec<String>>,
pub filenames: Option<Vec<String>>,
pub interpreters: Option<Vec<String>>,
pub language_id: i32,
pub color: Option<String>,
pub tm_scope: Option<String>,
pub group: Option<String>,
}
pub type Languages = BTreeMap<String, Language>;
pub fn color_from_extension(languages: &Languages, extension: &str) -> String {
let mut found = Vec::new();
for l in languages.values() {
if let Some(e) = &l.extensions {
if e.contains(&extension.to_string()) {
found.push(l);
}
}
}
let mut color = "".to_string();
if !found.is_empty() {
let mut min = i32::MAX;
for f in found {
if f.language_id < min && f.tm_scope.clone().unwrap_or_default() != "none" {
color = f.color.clone().unwrap_or_default();
min = f.language_id;
}
}
}
color
}
pub fn kind_from_extension(languages: &Languages, extension: &str) -> String {
let mut found = Vec::new();
for l in languages.values() {
if let Some(e) = &l.extensions {
if e.contains(&extension.to_string()) {
found.push(l);
}
}
}
let mut kind = "".to_string();
if !found.is_empty() {
let mut min = i32::MAX;
for f in found {
if f.language_id < min && f.tm_scope.clone().unwrap_or_default() != "none" {
kind = f.kind.clone();
min = f.language_id;
}
}
}
kind
}
pub fn new() -> Languages {
let bytes = include_bytes!("./res/languages.yml");
let yaml = String::from_utf8_lossy(bytes);
serde_yaml::from_str(yaml.into_owned().as_str()).unwrap()
}