// bibiman - a TUI for managing BibLaTeX databases // Copyright (C) 2024 lukeflo // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . ///// use std::path::PathBuf; use color_eyre::eyre::Result; use figment::{ providers::{Format, Serialized, Toml}, Figment, }; use ratatui::style::Color; use serde::{Deserialize, Serialize}; use crate::cliargs::CLIArgs; /// Main struct of the config file. Contains substructs/headings in toml #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] pub struct BibiConfig { pub general: General, pub colors: Colors, } /// Substruct [general] in config.toml #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] pub struct General { pub bibfiles: Option>, pub editor: Option, pub pdf_opener: String, pub url_opener: String, } /// Substruct [colors] in config.toml #[derive(Debug, Clone, Deserialize, Serialize, PartialEq)] pub struct Colors { pub main_text_color: Color, pub highlight_text_color: Color, pub entry_color: Color, pub keyword_color: Color, pub info_color: Color, pub confirm_color: Color, pub warn_color: Color, pub bar_bg_color: Color, pub popup_bg_color: Color, pub selected_row_bg_color: Color, } impl Default for BibiConfig { fn default() -> Self { Self { general: General { bibfiles: None, editor: None, pdf_opener: select_opener(), url_opener: select_opener(), }, colors: Colors { main_text_color: Color::Indexed(250), highlight_text_color: Color::Indexed(254), entry_color: Color::Indexed(36), keyword_color: Color::Indexed(101), info_color: Color::Indexed(99), confirm_color: Color::Indexed(47), warn_color: Color::Indexed(124), bar_bg_color: Color::Indexed(235), popup_bg_color: Color::Indexed(234), selected_row_bg_color: Color::Indexed(237), }, } } } impl BibiConfig { pub fn parse_config(args: &CLIArgs) -> Result { let cfg_file: BibiConfig = if args.cfg_path.is_file() { Figment::from(Serialized::defaults(BibiConfig::default())) .merge(Toml::file(&args.cfg_path)) .extract()? } else { BibiConfig::default() }; Ok(cfg_file) } /// Activates the default color scheme for light background terminals pub fn light_colors(&mut self) { self.colors.main_text_color = Color::Indexed(235); self.colors.highlight_text_color = Color::Indexed(232); self.colors.entry_color = Color::Indexed(23); self.colors.keyword_color = Color::Indexed(58); self.colors.info_color = Color::Indexed(57); self.colors.bar_bg_color = Color::Indexed(144); self.colors.popup_bg_color = Color::Indexed(187); self.colors.confirm_color = Color::Indexed(22); self.colors.selected_row_bg_color = Color::Indexed(107); } } 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"), } } #[cfg(test)] mod tests { use figment::{ providers::{Format, Toml}, Figment, }; use super::BibiConfig; #[test] fn parse_default_config() { figment::Jail::expect_with(|jail| { jail.create_file( "bibiman.toml", r#" [general] pdf_opener = "xdg-open" url_opener = "xdg-open" [colors] main_text_color = "250" highlight_text_color = "254" entry_color = "36" keyword_color = "101" info_color = "99" confirm_color = "47" warn_color = "124" bar_bg_color = "235" popup_bg_color = "234" selected_row_bg_color = "237" "#, )?; let config: BibiConfig = Figment::new().merge(Toml::file("bibiman.toml")).extract()?; let default_config: BibiConfig = BibiConfig::default(); assert_eq!(config, default_config); assert_eq!(config.general.bibfiles, None); assert_eq!(config.general.editor, None); Ok(()) }); } }