use serde::Deserialize;
#[non_exhaustive]
#[derive(Debug, Clone, Deserialize)]
#[serde(default)]
pub struct I18nConfig {
pub locales_path: String,
pub default_locale: String,
pub locale_cookie: String,
pub locale_query_param: String,
}
impl Default for I18nConfig {
fn default() -> Self {
Self {
locales_path: "locales".into(),
default_locale: "en".into(),
locale_cookie: "lang".into(),
locale_query_param: "lang".into(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_config_has_sensible_values() {
let config = I18nConfig::default();
assert_eq!(config.locales_path, "locales");
assert_eq!(config.default_locale, "en");
assert_eq!(config.locale_cookie, "lang");
assert_eq!(config.locale_query_param, "lang");
}
#[test]
fn config_deserializes_from_yaml() {
let yaml = r#"
locales_path: "i18n"
default_locale: "uk"
locale_cookie: "locale"
locale_query_param: "locale"
"#;
let config: I18nConfig = serde_yaml_ng::from_str(yaml).unwrap();
assert_eq!(config.locales_path, "i18n");
assert_eq!(config.default_locale, "uk");
assert_eq!(config.locale_cookie, "locale");
assert_eq!(config.locale_query_param, "locale");
}
#[test]
fn config_uses_defaults_for_missing_fields() {
let yaml = r#"
default_locale: "uk"
"#;
let config: I18nConfig = serde_yaml_ng::from_str(yaml).unwrap();
assert_eq!(config.default_locale, "uk");
assert_eq!(config.locales_path, "locales");
assert_eq!(config.locale_cookie, "lang");
assert_eq!(config.locale_query_param, "lang");
}
}