diff --git a/helix-core/src/config.rs b/helix-core/src/config.rs new file mode 100644 index 00000000..5bd16abd --- /dev/null +++ b/helix-core/src/config.rs @@ -0,0 +1,33 @@ +use crate::merge_toml_values; + +/// Default bultin-in languages.toml. +pub fn default_lang_config() -> toml::Value { + toml::from_slice(include_bytes!("../../languages.toml")) + .expect("Could not parse bultin-in languages.toml to valid toml") +} + +/// User configured languages.toml file, merged with the default config. +pub fn user_lang_config() -> Result { + let def_lang_conf = default_lang_config(); + let data = std::fs::read(crate::config_dir().join("languages.toml")); + let user_lang_conf = match data { + Ok(raw) => { + let value = toml::from_slice(&raw)?; + merge_toml_values(def_lang_conf, value) + } + Err(_) => def_lang_conf, + }; + + Ok(user_lang_conf) +} + +/// Syntax configuration loader based on built-in languages.toml. +pub fn default_syntax_loader() -> crate::syntax::Configuration { + default_lang_config() + .try_into() + .expect("Could not serialize built-in language.toml") +} +/// Syntax configuration loader based on user configured languages.toml. +pub fn user_syntax_loader() -> Result { + user_lang_config()?.try_into() +} diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs index fa8566ab..8e5950de 100644 --- a/helix-core/src/lib.rs +++ b/helix-core/src/lib.rs @@ -3,6 +3,7 @@ pub use encoding_rs as encoding; pub mod auto_pairs; pub mod chars; pub mod comment; +pub mod config; pub mod diagnostic; pub mod diff; pub mod graphemes; diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index 52a5321f..6ba05498 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -1,4 +1,7 @@ -use helix_core::{merge_toml_values, pos_at_coords, syntax, Selection}; +use helix_core::{ + config::{default_syntax_loader, user_syntax_loader}, + pos_at_coords, syntax, Selection, +}; use helix_dap::{self as dap, Payload, Request}; use helix_lsp::{lsp, util::lsp_pos_to_pos, LspProgressMap}; use helix_view::{editor::Breakpoint, theme, Editor}; @@ -69,21 +72,6 @@ impl Application { std::sync::Arc::new(theme::Loader::new(&conf_dir, &helix_core::runtime_dir())); // load default and user config, and merge both - 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)); - let lang_conf = match user_lang_conf { - Some(Ok(value)) => Ok(merge_toml_values(def_lang_conf, value)), - Some(err @ Err(_)) => err, - None => Ok(def_lang_conf), - }; - let true_color = config.editor.true_color || crate::true_color(); let theme = config .theme @@ -106,16 +94,14 @@ impl Application { } }); - let syn_loader_conf: helix_core::syntax::Configuration = lang_conf - .and_then(|conf| conf.try_into()) - .unwrap_or_else(|err| { - eprintln!("Bad language config: {}", err); - eprintln!("Press 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_conf = user_syntax_loader().unwrap_or_else(|err| { + eprintln!("Bad language config: {}", err); + eprintln!("Press to continue with default language config"); + use std::io::Read; + // This waits for an enter press. + let _ = std::io::stdin().read(&mut []); + default_syntax_loader() + }); let syn_loader = std::sync::Arc::new(syntax::Loader::new(syn_loader_conf)); let mut editor = Editor::new(