use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConfigSource {
Default,
ConfigFile(PathBuf),
EnvVar(String),
Profile(String),
CliArg(String),
AutoConfig,
}
impl ConfigSource {
pub fn label(&self) -> String {
match self {
ConfigSource::Default => "default".to_string(),
ConfigSource::ConfigFile(path) => path.display().to_string(),
ConfigSource::EnvVar(name) => format!("{} env", name),
ConfigSource::Profile(name) => format!("profile: {}", name),
ConfigSource::CliArg(flag) => format!("cli: {}", flag),
ConfigSource::AutoConfig => "auto-config".to_string(),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct ConfigSources {
inner: HashMap<String, ConfigSource>,
}
impl ConfigSources {
pub fn new() -> Self {
Self::default()
}
pub fn set(&mut self, key: impl Into<String>, source: ConfigSource) {
self.inner.insert(key.into(), source);
}
pub fn get(&self, key: &str) -> Option<&ConfigSource> {
self.inner.get(key)
}
pub fn iter(&self) -> impl Iterator<Item = (&String, &ConfigSource)> {
let mut keys: Vec<&String> = self.inner.keys().collect();
keys.sort();
keys.into_iter().map(move |k| (k, &self.inner[k]))
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
}
#[cfg(test)]
#[path = "../../tests/unit/config/provenance/provenance_test.rs"]
mod tests;