// 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)] pub struct BibiConfig { pub general: General, pub colors: Colors, } /// Substruct [general] in config.toml #[derive(Debug, Clone, Deserialize, Serialize)] 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)] 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"), } }