aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmnikar2021-11-09 02:07:54 +0000
committerGitHub2021-11-09 02:07:54 +0000
commita424ef4e209c0483385acedffd2331534f0ce906 (patch)
treebf41c9fe7cf86df3fc6f10a91e0efa2e88e233fe
parenteb68cd37671ced61d2a64d2042fde53190d0f296 (diff)
Use default `languages.toml` if user's is invalid (#994)
-rw-r--r--helix-core/src/syntax.rs3
-rw-r--r--helix-term/src/application.rs28
2 files changed, 22 insertions, 9 deletions
diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs
index a5dd0c59..142265a8 100644
--- a/helix-core/src/syntax.rs
+++ b/helix-core/src/syntax.rs
@@ -40,13 +40,14 @@ where
}
#[derive(Debug, Serialize, Deserialize)]
+#[serde(deny_unknown_fields)]
pub struct Configuration {
pub language: Vec<LanguageConfiguration>,
}
// largely based on tree-sitter/cli/src/loader.rs
#[derive(Debug, Serialize, Deserialize)]
-#[serde(rename_all = "kebab-case")]
+#[serde(rename_all = "kebab-case", deny_unknown_fields)]
pub struct LanguageConfiguration {
#[serde(rename = "name")]
pub language_id: String,
diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index 6037148f..f1884199 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -60,14 +60,19 @@ impl Application {
std::sync::Arc::new(theme::Loader::new(&conf_dir, &helix_core::runtime_dir()));
// load default and user config, and merge both
- let def_lang_conf: toml::Value = toml::from_slice(include_bytes!("../../languages.toml"))
- .expect("Could not parse built-in languages.toml, something must be very wrong");
- let user_lang_conf: Option<toml::Value> = std::fs::read(conf_dir.join("languages.toml"))
+ let builtin_err_msg =
+ "Could not parse built-in languages.toml, something must be very wrong";
+ let def_lang_conf: toml::Value =
+ toml::from_slice(include_bytes!("../../languages.toml")).expect(builtin_err_msg);
+ let def_syn_loader_conf: helix_core::syntax::Configuration =
+ def_lang_conf.clone().try_into().expect(builtin_err_msg);
+ let user_lang_conf = std::fs::read(conf_dir.join("languages.toml"))
.ok()
- .map(|raw| toml::from_slice(&raw).expect("Could not parse user languages.toml"));
+ .map(|raw| toml::from_slice(&raw));
let lang_conf = match user_lang_conf {
- Some(value) => merge_toml_values(def_lang_conf, value),
- None => def_lang_conf,
+ Some(Ok(value)) => Ok(merge_toml_values(def_lang_conf, value)),
+ Some(err @ Err(_)) => err,
+ None => Ok(def_lang_conf),
};
let theme = if let Some(theme) = &config.theme {
@@ -83,8 +88,15 @@ impl Application {
};
let syn_loader_conf: helix_core::syntax::Configuration = lang_conf
- .try_into()
- .expect("Could not parse merged (built-in + user) languages.toml");
+ .and_then(|conf| conf.try_into())
+ .unwrap_or_else(|err| {
+ eprintln!("Bad language config: {}", err);
+ eprintln!("Press <ENTER> to continue with default language config");
+ use std::io::Read;
+ // This waits for an enter press.
+ let _ = std::io::stdin().read(&mut []);
+ def_syn_loader_conf
+ });
let syn_loader = std::sync::Arc::new(syntax::Loader::new(syn_loader_conf));
let mut editor = Editor::new(