From b75e759a5fe512521f6b542889a584907e9d59b9 Mon Sep 17 00:00:00 2001 From: clux Date: Wed, 22 May 2024 19:45:42 +0100 Subject: [PATCH] Fix traefik middleware map of preserve-unknown-fields Signed-off-by: clux --- src/analyzer.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/analyzer.rs b/src/analyzer.rs index e24cbbd..cbd23a2 100644 --- a/src/analyzer.rs +++ b/src/analyzer.rs @@ -351,6 +351,7 @@ fn resolve_additional_properties( // This case is for maps. It is generally String -> Something, depending on the type key: let dict_type = s.type_.clone().unwrap_or_default(); + debug!("dict type is {dict_type}"); let dict_key = match dict_type.as_ref() { "string" => Some("String".into()), // We are not 100% sure the array and object subcases here are correct but they pass tests atm. @@ -393,6 +394,8 @@ fn resolve_additional_properties( "" => { if s.x_kubernetes_int_or_string.is_some() { Some("IntOrString".into()) + } else if s.x_kubernetes_preserve_unknown_fields == Some(true) { + Some("serde_json::Value".into()) } else { bail!("unknown empty dict type for {}", key) } @@ -650,6 +653,30 @@ type: object assert_eq!(match_labels.type_, "BTreeMap"); } + #[test] + fn additional_preserve_unknown() { + init(); + let schema_str = r#" + description: MiddlewareSpec defines the desired state of a Middleware. + properties: + plugin: + additionalProperties: + x-kubernetes-preserve-unknown-fields: true + description: traefik middleware crd + type: object + type: object"#; + let schema: JSONSchemaProps = serde_yaml::from_str(schema_str).unwrap(); + println!("got {schema:?}"); + + let structs = analyze(schema, "Spec", Cfg::default()).unwrap().0; + println!("got: {structs:?}"); + let root = &structs[0]; + assert_eq!(root.name, "Spec"); + let member = &root.members[0]; + assert_eq!(member.name, "plugin"); + assert_eq!(member.type_, "Option>"); + } + #[test] fn no_type_preserve_unknown_fields() { init();