diff options
Diffstat (limited to 'src/config.rs')
| -rw-r--r-- | src/config.rs | 111 |
1 files changed, 104 insertions, 7 deletions
diff --git a/src/config.rs b/src/config.rs index abb610b..22873dd 100644 --- a/src/config.rs +++ b/src/config.rs @@ -19,6 +19,7 @@ use std::path::PathBuf; use color_eyre::eyre::Result; use config::{ConfigError, FileFormat}; +use ratatui::style::Color; use serde::Deserialize; use crate::cliargs::CLIArgs; @@ -26,7 +27,8 @@ use crate::cliargs::CLIArgs; /// Main struct of the config file. Contains substructs/headings in toml #[derive(Debug, Clone, Deserialize)] pub struct BibiConfig { - pub general: General, + pub general: Option<General>, + pub colors: Option<Colors>, } /// Substruct [general] in config.toml @@ -38,17 +40,103 @@ pub struct General { pub url_opener: Option<String>, } -impl BibiConfig { - pub fn default() -> Self { +/// Substruct [colors] in config.toml +#[derive(Debug, Clone, Deserialize)] +pub struct Colors { + pub main_text_color: Option<Color>, + pub highlight_text_color: Option<Color>, + pub entry_color: Option<Color>, + pub keyword_color: Option<Color>, + pub info_color: Option<Color>, + pub confirm_color: Option<Color>, + pub warn_color: Option<Color>, + pub bar_bg_color: Option<Color>, + pub popup_bg_color: Option<Color>, + pub selected_row_bg_color: Option<Color>, +} + +impl Default for BibiConfig { + fn default() -> Self { Self { - general: General { + general: Some(General { bibfiles: None, editor: None, - pdf_opener: None, - url_opener: None, - }, + pdf_opener: Some(select_opener()), + url_opener: Some(select_opener()), + }), + colors: Some(Colors { + main_text_color: Some(Color::Indexed(250)), + highlight_text_color: Some(Color::Indexed(254)), + entry_color: Some(Color::Indexed(36)), + keyword_color: Some(Color::Indexed(101)), + info_color: Some(Color::Indexed(99)), + confirm_color: Some(Color::Indexed(47)), + warn_color: Some(Color::Indexed(124)), + bar_bg_color: Some(Color::Indexed(234)), + popup_bg_color: Some(Color::Indexed(234)), + selected_row_bg_color: Some(Color::Indexed(237)), + }), } } +} + +impl BibiConfig { + pub fn parse_config(&mut self, args: &CLIArgs) -> Result<()> { + if args.cfg_path.is_file() { + let cfg_file = Self::parse_cfg_file(args)?; + + if let Some(general) = cfg_file.general { + if let Some(bibfiles) = general.bibfiles { + self.general.as_mut().unwrap().bibfiles = Some(bibfiles) + } + if let Some(editor) = general.editor { + self.general.as_mut().unwrap().editor = Some(editor) + } + if let Some(pdf_opener) = general.pdf_opener { + self.general.as_mut().unwrap().pdf_opener = Some(pdf_opener) + } + if let Some(url_opener) = general.url_opener { + self.general.as_mut().unwrap().url_opener = Some(url_opener) + } + } + + if let Some(colors) = cfg_file.colors { + if let Some(main_text_color) = colors.main_text_color { + self.colors.as_mut().unwrap().main_text_color = Some(main_text_color) + } + if let Some(highlight_text_color) = colors.highlight_text_color { + self.colors.as_mut().unwrap().highlight_text_color = Some(highlight_text_color) + } + if let Some(entry_color) = colors.entry_color { + self.colors.as_mut().unwrap().entry_color = Some(entry_color) + } + if let Some(keyword_color) = colors.keyword_color { + self.colors.as_mut().unwrap().keyword_color = Some(keyword_color) + } + if let Some(info_color) = colors.info_color { + self.colors.as_mut().unwrap().info_color = Some(info_color) + } + if let Some(confirm_color) = colors.confirm_color { + self.colors.as_mut().unwrap().confirm_color = Some(confirm_color) + } + if let Some(warn_color) = colors.warn_color { + self.colors.as_mut().unwrap().warn_color = Some(warn_color) + } + if let Some(bar_bg_color) = colors.bar_bg_color { + self.colors.as_mut().unwrap().bar_bg_color = Some(bar_bg_color) + } + if let Some(popup_bg_color) = colors.popup_bg_color { + self.colors.as_mut().unwrap().popup_bg_color = Some(popup_bg_color) + } + if let Some(selected_row_bg_color) = colors.selected_row_bg_color { + self.colors.as_mut().unwrap().selected_row_bg_color = + Some(selected_row_bg_color) + } + } + } + + Ok(()) + } pub fn new(args: &CLIArgs) -> Result<Self> { // let mut cfg = config::Config::builder(); @@ -71,3 +159,12 @@ impl BibiConfig { cfg.build()?.try_deserialize() } } + +fn select_opener() -> String { + match std::env::consts::OS { + "linux" => String::from("xdg-open"), + "macos" => String::from("open"), + "windows" => String::from("start"), + _ => panic!("Couldn't detect OS for setting correct opener"), + } +} |
