use figment::Figment;
use figment::providers::{Env, Format, Serialized, Toml};
use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Config {
#[serde(default = "default_graph_path")]
pub graph: PathBuf,
#[serde(default)]
pub issuer: Option<String>,
#[serde(default = "default_format")]
pub format: String,
#[serde(default)]
pub min_score: i32,
}
fn default_graph_path() -> PathBuf {
PathBuf::from("qualifier.graph.jsonl")
}
fn default_format() -> String {
"human".into()
}
impl Default for Config {
fn default() -> Self {
Config {
graph: default_graph_path(),
issuer: None,
format: default_format(),
min_score: 0,
}
}
}
pub fn load(project_root: Option<&Path>) -> Config {
let mut figment = Figment::new().merge(Serialized::defaults(Config::default()));
if let Ok(home) = std::env::var("HOME") {
let user_config = PathBuf::from(home)
.join(".config")
.join("qualifier")
.join("config.toml");
figment = figment.merge(Toml::file(user_config));
}
if let Some(root) = project_root {
let project_config = root.join(".qualifier.toml");
figment = figment.merge(Toml::file(project_config));
}
figment = figment.merge(Env::prefixed("QUALIFIER_"));
figment.extract().unwrap_or_default()
}
pub fn load_graph(
explicit_path: Option<&str>,
root: Option<&Path>,
) -> crate::graph::DependencyGraph {
if let Some(path) = explicit_path {
crate::graph::load(Path::new(path))
.unwrap_or_else(|_| crate::graph::DependencyGraph::empty())
} else if let Some(root) = root {
let default = root.join("qualifier.graph.jsonl");
if default.exists() {
crate::graph::load(&default).unwrap_or_else(|_| crate::graph::DependencyGraph::empty())
} else {
crate::graph::DependencyGraph::empty()
}
} else {
crate::graph::DependencyGraph::empty()
}
}