aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cliargs.rs12
-rw-r--r--src/config.rs46
-rw-r--r--src/main.rs6
3 files changed, 63 insertions, 1 deletions
diff --git a/src/cliargs.rs b/src/cliargs.rs
index 71ba38c..ecec93e 100644
--- a/src/cliargs.rs
+++ b/src/cliargs.rs
@@ -17,6 +17,7 @@
use color_eyre::eyre::Result;
use color_eyre::owo_colors::OwoColorize;
+use dirs::{config_dir, home_dir};
use lexopt::prelude::*;
use std::env;
use std::path::PathBuf;
@@ -31,6 +32,7 @@ pub struct CLIArgs {
pub versionarg: bool,
pub pos_args: Vec<PathBuf>,
pub files: Vec<PathBuf>,
+ pub cfg_path: PathBuf,
// INFO: AppColors struct later should be moved to config/app struct
// when config file is implemented
pub colors: AppColors,
@@ -41,10 +43,18 @@ impl CLIArgs {
let mut args = CLIArgs::default();
let mut parser = lexopt::Parser::from_env();
+ // Default config
+ args.cfg_path = if config_dir().is_some() {
+ config_dir().unwrap().join("bibiman/bibiman.toml")
+ } else {
+ home_dir().unwrap().join(".config/bibiman/bibiman.toml")
+ };
+
while let Some(arg) = parser.next()? {
match arg {
Short('h') | Long("help") => args.helparg = true,
Short('v') | Long("version") => args.versionarg = true,
+ Short('c') | Long("config-file") => args.cfg_path = parser.value()?.parse()?,
Long("light-terminal") => {
args.colors.light_colors();
args.colors.toggle_color_scheme()
@@ -114,6 +124,8 @@ POSITIONAL ARGS:
FLAGS:
-h, --help Show this help and exit
-v, --version Show the version and exit
+ -c, --config-file Path to config file used for current session.
+ Takes precedence over standard config file.
--light-terminal Enable color mode for light terminal background",
env!("CARGO_PKG_NAME"),
env!("CARGO_PKG_VERSION"),
diff --git a/src/config.rs b/src/config.rs
new file mode 100644
index 0000000..2ef296a
--- /dev/null
+++ b/src/config.rs
@@ -0,0 +1,46 @@
+// 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 <https://www.gnu.org/licenses/>.
+/////
+
+use std::path::PathBuf;
+
+use config::{ConfigError, FileFormat};
+use serde::Deserialize;
+
+use crate::cliargs::CLIArgs;
+
+#[derive(Debug, Clone, Deserialize)]
+pub struct BibiConfig {
+ pub general: General,
+}
+
+#[derive(Debug, Clone, Deserialize)]
+pub struct General {
+ pub bibfiles: Vec<PathBuf>,
+ pub editor: String,
+}
+
+impl BibiConfig {
+ pub fn new(args: &mut CLIArgs) -> Result<Self, ConfigError> {
+ let mut cfg = config::Config::builder();
+ cfg = cfg.add_source(
+ config::File::from(args.cfg_path.clone())
+ .format(FileFormat::Toml)
+ .required(true),
+ );
+ cfg.build()?.try_deserialize()
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index 78c5075..a0f69d1 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -18,18 +18,20 @@
use app::App;
use cliargs::CLIArgs;
use color_eyre::eyre::Result;
+use config::BibiConfig;
use errorsetup::init_error_hooks;
pub mod app;
pub mod bibiman;
pub mod cliargs;
+pub mod config;
pub mod errorsetup;
pub mod tui;
#[tokio::main]
async fn main() -> Result<()> {
// Parse CLI arguments
- let mut parsed_args = CLIArgs::parse_args().unwrap();
+ let mut parsed_args = CLIArgs::parse_args()?;
// Print help if -h/--help flag is passed and exit
if parsed_args.helparg {
@@ -43,6 +45,8 @@ async fn main() -> Result<()> {
std::process::exit(0);
}
+ let cfg = BibiConfig::new(&mut parsed_args)?;
+
init_error_hooks()?;
// Create an application.