use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ConfigValueSource {
BuiltinDefault,
Manifest,
UserConfig,
WorkspaceConfig,
PackageConfig,
ExplicitConfig,
Env,
Cli,
}
impl ConfigValueSource {
pub const fn as_key(self) -> &'static str {
match self {
ConfigValueSource::BuiltinDefault => "builtin-default",
ConfigValueSource::Manifest => "manifest",
ConfigValueSource::UserConfig => "user-config",
ConfigValueSource::WorkspaceConfig => "workspace-config",
ConfigValueSource::PackageConfig => "package-config",
ConfigValueSource::ExplicitConfig => "explicit-config",
ConfigValueSource::Env => "env",
ConfigValueSource::Cli => "cli",
}
}
}
impl fmt::Display for ConfigValueSource {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_key())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn keys_round_trip_with_serde() {
for source in [
ConfigValueSource::BuiltinDefault,
ConfigValueSource::Manifest,
ConfigValueSource::UserConfig,
ConfigValueSource::WorkspaceConfig,
ConfigValueSource::PackageConfig,
ConfigValueSource::ExplicitConfig,
ConfigValueSource::Env,
ConfigValueSource::Cli,
] {
let json = serde_json::to_string(&source).unwrap();
let echoed: ConfigValueSource = serde_json::from_str(&json).unwrap();
assert_eq!(echoed, source);
assert_eq!(json.trim_matches('"'), source.as_key());
}
}
}