anodizer_core/config/
partial.rs1use schemars::JsonSchema;
2use serde::{Deserialize, Deserializer, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize, Default, JsonSchema)]
9#[serde(default, deny_unknown_fields)]
10pub struct PartialConfig {
11 #[serde(default, deserialize_with = "deserialize_partial_by")]
19 pub by: Option<String>,
20}
21
22fn deserialize_partial_by<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
27where
28 D: Deserializer<'de>,
29{
30 let raw = Option::<String>::deserialize(deserializer)?;
31 Ok(raw.map(|v| {
32 if v == "goos" {
33 tracing::warn!(
34 "DEPRECATION: partial.by: 'goos' is renamed to 'os'. The 'goos' \
35 spelling still works but will be removed in a future release; \
36 switch to 'os'."
37 );
38 "os".to_string()
39 } else {
40 v
41 }
42 }))
43}
44
45#[cfg(test)]
46mod by_alias_tests {
47 use super::*;
48
49 #[test]
52 fn goos_alias_folds_into_os() {
53 let cfg: PartialConfig = serde_yaml_ng::from_str("by: goos").unwrap();
54 assert_eq!(cfg.by.as_deref(), Some("os"));
55 }
56
57 #[test]
58 fn canonical_os_passes_through() {
59 let cfg: PartialConfig = serde_yaml_ng::from_str("by: os").unwrap();
60 assert_eq!(cfg.by.as_deref(), Some("os"));
61 }
62
63 #[test]
64 fn target_passes_through() {
65 let cfg: PartialConfig = serde_yaml_ng::from_str("by: target").unwrap();
66 assert_eq!(cfg.by.as_deref(), Some("target"));
67 }
68
69 #[test]
73 fn unknown_value_passes_through_unchanged() {
74 let cfg: PartialConfig = serde_yaml_ng::from_str("by: bogus").unwrap();
75 assert_eq!(cfg.by.as_deref(), Some("bogus"));
76 }
77}