diff options
| author | lukeflo | 2025-02-21 20:17:27 +0100 |
|---|---|---|
| committer | lukeflo | 2025-02-21 20:17:27 +0100 |
| commit | ddb6326c1896b82b759d930fb08ea46a820e275a (patch) | |
| tree | 8fd4db8081770e0c4b4bdbf3c680c48637da8a03 /src | |
| parent | f60be8b6b1e5987613081c9ad8d63a26a1a1bac9 (diff) | |
| download | bibiman-ddb6326c1896b82b759d930fb08ea46a820e275a.tar.gz bibiman-ddb6326c1896b82b759d930fb08ea46a820e275a.zip | |
parse config file
+ set default values for config fields
+ merge fields named in the config file with default values
+ values from file take precedence over default values
+ to accomplish this, all config values are wrapped in `Option<T>`
Diffstat (limited to 'src')
| -rw-r--r-- | src/app.rs | 12 | ||||
| -rw-r--r-- | src/bibiman.rs | 6 | ||||
| -rw-r--r-- | src/config.rs | 111 | ||||
| -rw-r--r-- | src/main.rs | 12 |
4 files changed, 116 insertions, 25 deletions
@@ -364,11 +364,7 @@ impl App { pub fn open_connected_file(cfg: &BibiConfig, file: &OsStr) -> Result<()> { // Build command to execute pdf-reader. 'xdg-open' is Linux standard - let cmd = match &cfg.general.pdf_opener { - Some(c) => c, - None => &select_opener(), - }; - + let cmd = cfg.general.as_ref().unwrap().pdf_opener.as_ref().unwrap(); // If necessary, replace ~ with /home dir let file = PathBuf::from(file); @@ -388,11 +384,7 @@ pub fn open_connected_file(cfg: &BibiConfig, file: &OsStr) -> Result<()> { pub fn open_connected_link(cfg: &BibiConfig, link: &str) -> Result<()> { // Build command to execute pdf-reader. 'xdg-open' is Linux standard - let cmd = match &cfg.general.url_opener { - Some(c) => c, - None => &select_opener(), - }; - + let cmd = cfg.general.as_ref().unwrap().url_opener.as_ref().unwrap(); // Pass filepath as argument, pipe stdout and stderr to /dev/null // to keep the TUI clean (where is it piped on Windows???) let _ = Command::new(cmd) diff --git a/src/bibiman.rs b/src/bibiman.rs index ecddc4c..b68b0fa 100644 --- a/src/bibiman.rs +++ b/src/bibiman.rs @@ -85,8 +85,8 @@ impl Bibiman { // Constructs a new instance of [`App`]. pub fn new(args: &mut CLIArgs, cfg: &mut BibiConfig) -> Result<Self> { let mut main_bibfiles: Vec<PathBuf> = args.pos_args.clone(); - if cfg.general.bibfiles.is_some() { - main_bibfiles.append(cfg.general.bibfiles.as_mut().unwrap()) + if cfg.general.as_ref().unwrap().bibfiles.is_some() { + main_bibfiles.append(cfg.general.as_mut().unwrap().bibfiles.as_mut().unwrap()) }; let main_bibfiles = cliargs::parse_files(main_bibfiles); let main_biblio = BibiSetup::new(&main_bibfiles); @@ -381,7 +381,7 @@ impl Bibiman { tui.exit()?; // Use VISUAL or EDITOR. Set "vi" as last fallback let mut cmd: Command = EditorBuilder::new() - .source(cfg.general.editor.clone()) + .source(cfg.general.as_ref().unwrap().editor.clone()) .environment() .source(Some("vi")) .build() 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"), + } +} diff --git a/src/main.rs b/src/main.rs index d53aaab..8ec3b77 100644 --- a/src/main.rs +++ b/src/main.rs @@ -45,11 +45,13 @@ async fn main() -> Result<()> { std::process::exit(0); } - let mut cfg = if parsed_args.cfg_path.is_file() { - BibiConfig::new(&parsed_args)? - } else { - BibiConfig::default() - }; + // let mut cfg = if parsed_args.cfg_path.is_file() { + // BibiConfig::new(&parsed_args)? + // } else { + // BibiConfig::default() + // }; + let mut cfg = BibiConfig::default(); + cfg.parse_config(&parsed_args)?; init_error_hooks()?; |
