use super::config::VersioningStrategy;
use reinhardt_core::macros::settings;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
fn default_default_version() -> String {
"1.0".to_string()
}
fn default_strict_mode() -> bool {
true
}
fn default_strategy() -> VersioningStrategy {
VersioningStrategy::AcceptHeader
}
#[settings(fragment = true, section = "rest_versioning")]
#[non_exhaustive]
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct VersioningSettings {
#[serde(default = "default_default_version")]
pub default_version: String,
#[serde(default)]
pub allowed_versions: Vec<String>,
#[serde(default = "default_strategy")]
pub strategy: VersioningStrategy,
#[serde(default = "default_strict_mode")]
pub strict_mode: bool,
#[serde(default)]
pub version_param: Option<String>,
#[serde(default)]
pub hostname_patterns: Option<HashMap<String, String>>,
}
impl Default for VersioningSettings {
fn default() -> Self {
Self {
default_version: default_default_version(),
allowed_versions: vec![],
strategy: default_strategy(),
strict_mode: default_strict_mode(),
version_param: None,
hostname_patterns: None,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use reinhardt_conf::settings::fragment::SettingsFragment;
use rstest::rstest;
#[rstest]
fn test_versioning_section_name() {
let section = VersioningSettings::section();
assert_eq!(section, "rest_versioning");
}
#[rstest]
fn test_versioning_default_values() {
let settings = VersioningSettings::default();
assert_eq!(settings.default_version, "1.0");
assert!(settings.allowed_versions.is_empty());
assert!(matches!(
settings.strategy,
VersioningStrategy::AcceptHeader
));
assert!(settings.strict_mode);
assert!(settings.version_param.is_none());
assert!(settings.hostname_patterns.is_none());
}
#[rstest]
fn test_versioning_deserialize_from_json() {
let json = r#"{
"default_version": "2.0",
"allowed_versions": ["1.0", "2.0", "3.0"],
"strict_mode": false,
"strategy": { "type": "URLPath", "config": { "pattern": "/v{version}/" } }
}"#;
let settings: VersioningSettings = serde_json::from_str(json).unwrap();
assert_eq!(settings.default_version, "2.0");
assert_eq!(settings.allowed_versions, vec!["1.0", "2.0", "3.0"]);
assert!(!settings.strict_mode);
assert!(matches!(
settings.strategy,
VersioningStrategy::URLPath { .. }
));
}
}