use std::collections::HashMap;
use std::path::PathBuf;
use serde::Deserialize;
pub(crate) const CONFIG_FILE: &str = "multimr.toml";
pub(crate) const DEFAULT_BRANCHES: [&str; 2] = ["main", "master"];
#[derive(Debug, Default, Clone)]
pub(crate) struct Config {
pub working_dir: PathBuf,
pub reviewers: Vec<String>,
pub labels: HashMap<String, String>,
pub assignee: Option<String>,
pub dry_run: bool,
}
pub(crate) fn load_config_from_toml() -> Config {
let content = std::fs::read_to_string(CONFIG_FILE).unwrap_or_default();
#[derive(Deserialize)]
struct ConfigToml {
reviewers: Option<Vec<String>>,
labels: Option<HashMap<String, String>>,
working_dir: Option<String>,
assignee: Option<String>,
}
let parsed: ConfigToml = toml::from_str(&content).unwrap_or(ConfigToml {
reviewers: None,
labels: None,
working_dir: None,
assignee: None,
});
let working_dir_str = parsed.working_dir.unwrap_or(".".to_string());
let working_dir = if working_dir_str.starts_with('/') || working_dir_str.starts_with('\\') {
PathBuf::from(&working_dir_str)
.canonicalize()
.expect("Failed to resolve absolute path")
} else {
std::env::current_dir()
.unwrap_or_else(|_| PathBuf::from("."))
.join(working_dir_str)
.canonicalize()
.expect("Failed to resolve relative path")
};
Config {
working_dir,
reviewers: parsed.reviewers.unwrap_or_default(),
labels: parsed
.labels
.map(|m| m.into_iter().collect())
.unwrap_or_default(),
assignee: parsed.assignee,
dry_run: false, }
}