use std::collections::HashMap;
use provcfg::Category;
use serde::{Deserialize, Serialize};
use utoipa::ToSchema;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, ToSchema)]
#[serde(rename_all = "lowercase")]
pub enum ConfigSource {
Default,
Toml,
Env,
Cli,
}
impl From<Category> for ConfigSource {
fn from(category: Category) -> Self {
match category {
Category::File => Self::Toml,
Category::Env => Self::Env,
Category::Cli => Self::Cli,
_ => Self::Default,
}
}
}
pub type SourceMap = HashMap<String, ConfigSource>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn config_source_serialization() {
assert_eq!(
serde_json::to_string(&ConfigSource::Default).unwrap(),
"\"default\""
);
assert_eq!(
serde_json::to_string(&ConfigSource::Toml).unwrap(),
"\"toml\""
);
assert_eq!(
serde_json::to_string(&ConfigSource::Env).unwrap(),
"\"env\""
);
assert_eq!(
serde_json::to_string(&ConfigSource::Cli).unwrap(),
"\"cli\""
);
}
#[test]
fn from_category_maps_file_env_cli_explicitly() {
assert_eq!(ConfigSource::from(Category::File), ConfigSource::Toml);
assert_eq!(ConfigSource::from(Category::Env), ConfigSource::Env);
assert_eq!(ConfigSource::from(Category::Cli), ConfigSource::Cli);
}
#[test]
fn from_category_falls_back_to_default_for_default_category() {
assert_eq!(ConfigSource::from(Category::Default), ConfigSource::Default);
}
}