|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
use std::str::from_utf8;
|
|
|
|
|
use std::path::PathBuf;
|
|
|
|
|
|
|
|
|
|
/// Default built-in languages.toml.
|
|
|
|
|
pub fn default_lang_config() -> toml::Value {
|
|
|
|
@ -7,40 +8,28 @@ pub fn default_lang_config() -> toml::Value {
|
|
|
|
|
.expect("Could not parse built-in languages.toml to valid toml")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn merge_language_config(
|
|
|
|
|
left: toml::Value, file: PathBuf,
|
|
|
|
|
) -> Result<toml::Value, toml::de::Error> {
|
|
|
|
|
let right = std::fs::read_to_string(file).ok()
|
|
|
|
|
.map(|c| toml::from_str(&c)).transpose()?;
|
|
|
|
|
|
|
|
|
|
let config = match right {
|
|
|
|
|
Some(right) => crate::merge_toml_values(left, right, 3),
|
|
|
|
|
None => left,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Ok(config)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// User configured languages.toml file, merged with the default config.
|
|
|
|
|
pub fn user_lang_config() -> Result<toml::Value, toml::de::Error> {
|
|
|
|
|
let config = [
|
|
|
|
|
crate::config_dir(),
|
|
|
|
|
crate::find_workspace().0.join(".helix"),
|
|
|
|
|
]
|
|
|
|
|
.into_iter()
|
|
|
|
|
.map(|path| path.join("languages.toml"))
|
|
|
|
|
.filter_map(|file| {
|
|
|
|
|
std::fs::read_to_string(file)
|
|
|
|
|
.map(|config| toml::from_str(&config))
|
|
|
|
|
.ok()
|
|
|
|
|
})
|
|
|
|
|
.collect::<Result<Vec<_>, _>>()?
|
|
|
|
|
.into_iter()
|
|
|
|
|
.fold(default_lang_config(), |a, b| {
|
|
|
|
|
// combines for example
|
|
|
|
|
// b:
|
|
|
|
|
// [[language]]
|
|
|
|
|
// name = "toml"
|
|
|
|
|
// language-server = { command = "taplo", args = ["lsp", "stdio"] }
|
|
|
|
|
//
|
|
|
|
|
// a:
|
|
|
|
|
// [[language]]
|
|
|
|
|
// language-server = { command = "/usr/bin/taplo" }
|
|
|
|
|
//
|
|
|
|
|
// into:
|
|
|
|
|
// [[language]]
|
|
|
|
|
// name = "toml"
|
|
|
|
|
// language-server = { command = "/usr/bin/taplo" }
|
|
|
|
|
//
|
|
|
|
|
// thus it overrides the third depth-level of b with values of a if they exist, but otherwise merges their values
|
|
|
|
|
crate::merge_toml_values(a, b, 3)
|
|
|
|
|
});
|
|
|
|
|
let global = merge_language_config(default_lang_config(), crate::lang_config_file())?;
|
|
|
|
|
|
|
|
|
|
let config = match global.get("workspace-config").and_then(|v| v.as_bool()) {
|
|
|
|
|
Some(true) => merge_language_config(global, crate::workspace_lang_config_file())?,
|
|
|
|
|
_ => global,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Ok(config)
|
|
|
|
|
}
|
|
|
|
|