Implement specifying working_directory in config file

This commit is contained in:
2024-11-25 20:34:31 +01:00
parent 9a212a85ea
commit 26133a692f
5 changed files with 140 additions and 45 deletions

39
src/config.rs Normal file
View File

@@ -0,0 +1,39 @@
use anyhow::{anyhow, Context, Result};
use serde::Deserialize;
use std::fs;
use std::path::PathBuf;
use xdg::BaseDirectories;
#[derive(Debug, Deserialize)]
pub struct Config {
pub working_directory: Option<PathBuf>,
}
impl Config {
pub fn default() -> Config {
Config {
working_directory: None,
}
}
}
pub fn load_config(app_name: &str, file_name: &str) -> Result<Config> {
// Create an XDG base directories instance
let xdg_dirs =
BaseDirectories::with_prefix(app_name).context("Failed to initialize XDG directories")?;
let config_path = xdg_dirs
.place_config_file(file_name)
.context("Failed to determine configuration file path")?;
if !config_path.exists() {
return Err(anyhow!("No configuration file at {:?}", config_path));
}
let contents = fs::read_to_string(&config_path)
.with_context(|| format!("Failed to read configuration file at {:?}", config_path))?;
let config: Config = toml::from_str(&contents)
.with_context(|| format!("Failed to parse TOML configuration at {:?}", config_path))?;
Ok(config)
}

View File

@@ -1,3 +1,4 @@
mod config;
mod database;
mod sheet;
mod sheet_dao;
@@ -7,9 +8,10 @@ mod ui;
use std::{path::PathBuf, process};
use clap::Parser;
use config::Config;
use database::Database;
use env_logger::Env;
use log::error;
use log::{error, warn};
use relm4::RelmApp;
use crate::ui::app::{AppInitData, AppModel};
@@ -17,28 +19,49 @@ use crate::ui::app::{AppInitData, AppModel};
#[derive(Parser)]
#[command(author, version, about)]
struct Cli {
directory: PathBuf,
working_directory: Option<PathBuf>,
}
#[tokio::main]
async fn main() {
env_logger::Builder::from_env(Env::default().default_filter_or("debug")).init();
let mut config = match config::load_config("sheet-organizer", "config.toml") {
Ok(config) => config,
Err(err) => {
warn!("Could not get configuration: {:#}", err);
Config::default()
}
};
let cli = Cli::parse();
if !cli.directory.is_dir() {
error!("Sheet folder path is no dir or does not exist");
// Overwrite config by cli options if specified
if cli.working_directory.is_some() {
config.working_directory = cli.working_directory;
}
let working_directory = config.working_directory.unwrap_or_else(|| {
error!("No working directory specified, neither in config nor in cli. Exiting...");
process::exit(1);
});
if !working_directory.is_dir() {
error!(
"Working directory '{}' does not exist",
working_directory.to_string_lossy()
);
process::exit(1);
}
let database = Database::setup(cli.directory.join("database.sqlite"))
let database = Database::setup(working_directory.join("database.sqlite"))
.await
.unwrap();
let sheets = sheet_validation::load_and_validate_sheets(&database, &cli.directory).await;
let sheets = sheet_validation::load_and_validate_sheets(&database, &working_directory).await;
let app_init_data = AppInitData {
sheets,
database,
directory: cli.directory,
directory: working_directory,
};
let app = RelmApp::new("de.frajul.sheet-organizer");
// Pass empty command line args to allow my own parsing