use std::path::{Path, PathBuf};
use kak_tree_sitter_config::{GrammarConfig, LanguageConfig, source::Source};
use crate::error::HellNo;
#[derive(Debug)]
pub struct Resources {
runtime_dir: PathBuf,
data_dir: PathBuf,
}
impl Resources {
pub fn new() -> Result<Self, HellNo> {
let runtime_dir = dirs::runtime_dir()
.or(std::env::var("TMPDIR").map(PathBuf::from).ok())
.ok_or(HellNo::NoRuntimeDir)?
.join("ktsctl");
let data_dir = dirs::data_dir()
.ok_or(HellNo::NoDataDir)?
.join("kak-tree-sitter");
Ok(Self {
runtime_dir,
data_dir,
})
}
pub fn data_dir(&self) -> &Path {
&self.data_dir
}
pub fn sources_dir(&self, url: &str) -> PathBuf {
let url_dir = PathBuf::from(
url
.trim_start_matches("http")
.trim_start_matches('s')
.trim_start_matches("://"),
);
self.runtime_dir.join("sources").join(url_dir)
}
pub fn lang_build_dir(&self, path: &Path, src: &Path) -> PathBuf {
self.runtime_dir.join(format!(
"{path}/{src}/build",
path = path.display(),
src = src.display()
))
}
pub fn grammar_path_from_config(&self, lang: &str, config: &GrammarConfig) -> PathBuf {
match config.source {
Source::Local { ref path } => path.clone(),
Source::Git { ref pin, .. } => self.grammar_pin_path(lang, pin),
}
}
pub fn grammar_pin_path(&self, lang: &str, pin: &str) -> PathBuf {
self.data_dir.join(format!("grammars/{lang}/{pin}.so"))
}
pub fn queries_dir_from_config(&self, lang: &str, config: &LanguageConfig) -> Option<PathBuf> {
let path = match config.queries.source.as_ref()? {
Source::Local { path } => path.clone(),
Source::Git { pin, .. } => self.queries_pin_dir(lang, pin),
};
Some(path)
}
pub fn queries_pin_dir(&self, lang: &str, pin: &str) -> PathBuf {
self.data_dir.join(format!("queries/{lang}/{pin}"))
}
pub fn grammar_exists(&self, lang: &str, pin: &str) -> bool {
let path = self.grammar_pin_path(lang, pin);
matches!(path.try_exists(), Ok(true))
}
pub fn queries_exist(&self, lang: &str, pin: &str) -> bool {
let path = self.queries_pin_dir(lang, pin);
matches!(path.try_exists(), Ok(true))
}
pub fn grammars_dir(&self, lang: &str) -> PathBuf {
self.data_dir.join(format!("grammars/{lang}"))
}
pub fn queries_dir(&self, lang: &str) -> PathBuf {
self.data_dir.join(format!("queries/{lang}"))
}
}