use serde::{Deserialize, Serialize};
use crate::model::changeset::ChangeType;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum DependencyBump {
#[default]
Auto,
Match,
Patch,
Minor,
Major,
}
impl DependencyBump {
pub fn to_change_type(self, upstream: ChangeType) -> ChangeType {
match self {
Self::Patch => ChangeType::Patch,
Self::Minor => ChangeType::Minor,
Self::Major => ChangeType::Major,
Self::Match => upstream,
Self::Auto => match upstream {
ChangeType::Major => ChangeType::Major,
ChangeType::Minor | ChangeType::Patch => ChangeType::Patch,
},
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(default, deny_unknown_fields)]
pub struct PrepareConfig {
pub dependency_bump: DependencyBump,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn dependency_bump_default_is_auto() {
assert_eq!(DependencyBump::default(), DependencyBump::Auto);
}
#[test]
fn prepare_config_default_has_auto_dependency_bump() {
let config = PrepareConfig::default();
assert_eq!(config.dependency_bump, DependencyBump::Auto);
}
#[test]
fn dependency_bump_serializes_as_lowercase() {
let cases = [
(DependencyBump::Auto, "auto"),
(DependencyBump::Match, "match"),
(DependencyBump::Patch, "patch"),
(DependencyBump::Minor, "minor"),
(DependencyBump::Major, "major"),
];
for (variant, expected) in cases {
let config = PrepareConfig {
dependency_bump: variant,
};
let serialized = toml::to_string(&config).unwrap();
assert!(
serialized.contains(&format!("dependency_bump = \"{expected}\"")),
"Expected 'dependency_bump = \"{expected}\"' in:\n{serialized}"
);
}
}
#[test]
fn prepare_config_deserializes_dependency_bump_values() {
let config: PrepareConfig = toml::from_str("dependency_bump = \"auto\"").unwrap();
assert_eq!(config.dependency_bump, DependencyBump::Auto);
let config: PrepareConfig = toml::from_str("dependency_bump = \"match\"").unwrap();
assert_eq!(config.dependency_bump, DependencyBump::Match);
let config: PrepareConfig = toml::from_str("dependency_bump = \"patch\"").unwrap();
assert_eq!(config.dependency_bump, DependencyBump::Patch);
let config: PrepareConfig = toml::from_str("dependency_bump = \"minor\"").unwrap();
assert_eq!(config.dependency_bump, DependencyBump::Minor);
let config: PrepareConfig = toml::from_str("dependency_bump = \"major\"").unwrap();
assert_eq!(config.dependency_bump, DependencyBump::Major);
}
#[test]
fn prepare_config_rejects_unknown_fields() {
let result = toml::from_str::<PrepareConfig>("unknown_field = true");
assert!(result.is_err(), "Unknown fields should be rejected");
}
#[test]
fn prepare_config_round_trips_through_toml() {
let config = PrepareConfig {
dependency_bump: DependencyBump::Match,
};
let serialized = toml::to_string(&config).unwrap();
let deserialized: PrepareConfig = toml::from_str(&serialized).unwrap();
assert_eq!(config, deserialized);
}
}