use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "kebab-case")]
pub struct GrrConfig {
#[serde(default)]
pub oauth: OAuthConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
#[derive(Default)]
pub struct OAuthConfig {
#[serde(alias = "client_id")]
pub client_id: String,
#[serde(default, alias = "client_secret")]
pub client_secret: Option<String>,
}
#[cfg(test)]
mod config_compat_tests {
use super::*;
use figment::{
Figment,
providers::{Format, Toml},
};
#[test]
fn oauth_accepts_snake_case_keys_from_ts_era_configs() {
let toml = r#"
[oauth]
client_id = "id-123"
client_secret = "secret-456"
"#;
let config = Figment::new()
.merge(Toml::string(toml))
.extract::<GrrConfig>()
.unwrap_or_else(|_| GrrConfig::default());
assert_eq!(config.oauth.client_id, "id-123");
assert_eq!(config.oauth.client_secret.as_deref(), Some("secret-456"));
}
#[test]
fn oauth_accepts_kebab_case_keys() {
let toml = r#"
[oauth]
client-id = "id-123"
client-secret = "secret-456"
"#;
let config = Figment::new()
.merge(Toml::string(toml))
.extract::<GrrConfig>()
.unwrap_or_else(|_| GrrConfig::default());
assert_eq!(config.oauth.client_id, "id-123");
}
#[test]
fn legacy_config_sections_are_ignored() {
let toml = r#"
[oauth]
client-id = "id-123"
[performance]
max-concurrent = 99
[cache]
cache-dir = "/tmp/x"
"#;
let config = Figment::new()
.merge(Toml::string(toml))
.extract::<GrrConfig>()
.unwrap_or_else(|_| GrrConfig::default());
assert_eq!(config.oauth.client_id, "id-123");
}
}