use clap::Parser;
use directories::BaseDirs;
use merge2::Merge;
use serde::{Deserialize, Serialize};
use std::env::current_dir;
use std::fs;
use std::path::PathBuf;
use crate::tui::structs::Scope;
mod handle_config;
#[inline]
pub fn swap_option<T>(left: &mut Option<T>, right: &mut Option<T>) {
if left.is_none() || right.is_some() {
core::mem::swap(left, right);
}
}
#[derive(Parser)]
pub struct CliConfig {
#[clap(long, help = "set custom path to load config.")]
config: Option<PathBuf>,
#[clap(flatten)]
sc_config: SimpleCommitsConfig,
}
#[derive(Default, Serialize, Deserialize, Parser, Merge)]
pub struct SimpleCommitsConfig {
#[merge(skip)]
#[serde(skip)]
#[clap(skip)]
config: PathBuf,
#[clap(skip)]
#[serde(flatten)]
#[merge(strategy = swap_option)]
pub scopes: Option<Scope>,
#[clap(flatten)]
#[merge(strategy = swap_option)]
pub git: Option<GitConfig>,
}
#[derive(Clone, Default, Serialize, Deserialize, Parser, Merge)]
pub struct GitConfig {
#[arg(short = 'p', long = "skip-preview")]
pub skip_preview: bool,
#[arg(short = 'e', long = "skip-emojis")]
pub skip_emojis: bool,
#[clap(long, short)]
#[merge(strategy = swap_option)]
pub commit_template: Option<Vec<String>>,
}
impl SimpleCommitsConfig {
pub fn update(&self) -> std::io::Result<()> {
let updated = toml::to_string_pretty(&self).unwrap();
fs::write(&self.config, updated)?;
Ok(())
}
}
pub fn get_config() -> SimpleCommitsConfig {
let mut args = CliConfig::parse();
let mut config = SimpleCommitsConfig::default();
let config_path = args.config.unwrap_or_else(|| {
let path = BaseDirs::new().unwrap().config_dir().join("sc");
std::fs::create_dir_all(path.clone()).unwrap();
path.join("config.toml")
});
if let Ok(cfg_content) = std::fs::read_to_string(&config_path) {
let mut g_config: SimpleCommitsConfig = toml::from_str(&cfg_content).unwrap();
config.merge(&mut g_config);
config.config = config_path;
}
let config_path = current_dir()
.expect("Cannot get current directory")
.join("sc.toml");
if let Ok(cfg_content) = std::fs::read_to_string(&config_path) {
let mut l_config: SimpleCommitsConfig = toml::from_str(&cfg_content).unwrap();
config.merge(&mut l_config);
config.config = config_path;
}
config.merge(&mut args.sc_config);
config
}
pub fn start_logging() {
env_logger::builder()
.init();
}