From 3fbedb0eea2bb17707bbc17a7b9a2ad27c027eb3 Mon Sep 17 00:00:00 2001 From: William Woodruff Date: Thu, 24 Aug 2023 23:37:47 -0400 Subject: [PATCH] schemafy_lib: semi-handle patternProperties --- schemafy_lib/src/lib.rs | 47 ++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/schemafy_lib/src/lib.rs b/schemafy_lib/src/lib.rs index 0343b0f..e837619 100644 --- a/schemafy_lib/src/lib.rs +++ b/schemafy_lib/src/lib.rs @@ -608,29 +608,38 @@ impl<'r> Expander<'r> { }; let is_enum = schema.enum_.as_ref().map_or(false, |e| !e.is_empty()); let type_decl = if is_struct { - let serde_deny_unknown = if schema.additional_properties == Some(Value::Bool(false)) - && schema.pattern_properties.is_empty() - { - Some(quote! { #[serde(deny_unknown_fields)] }) - } else { - None - }; - if default { + if !schema.pattern_properties.is_empty() { quote! { - #[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)] + #[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] #serde_rename - #serde_deny_unknown - pub struct #name { - #(#fields),* - } + #[serde(transparent)] + pub struct #name(::std::collections::BTreeMap); } } else { - quote! { - #[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] - #serde_rename - #serde_deny_unknown - pub struct #name { - #(#fields),* + let serde_deny_unknown = if schema.additional_properties == Some(Value::Bool(false)) + && schema.pattern_properties.is_empty() + { + Some(quote! { #[serde(deny_unknown_fields)] }) + } else { + None + }; + if default { + quote! { + #[derive(Clone, PartialEq, Debug, Default, Deserialize, Serialize)] + #serde_rename + #serde_deny_unknown + pub struct #name { + #(#fields),* + } + } + } else { + quote! { + #[derive(Clone, PartialEq, Debug, Deserialize, Serialize)] + #serde_rename + #serde_deny_unknown + pub struct #name { + #(#fields),* + } } } }