Refactor flatten and move it to _private, remove TempFixupForTests, regenerate test schemas

This commit is contained in:
Graham Esau 2024-05-13 22:02:30 +01:00
parent 18300c67bb
commit c4d42ec11a
45 changed files with 280 additions and 330 deletions

View file

@ -434,73 +434,68 @@ fn expr_for_struct(
default: &SerdeDefault,
deny_unknown_fields: bool,
) -> TokenStream {
let (flattened_fields, property_fields): (Vec<_>, Vec<_>) = fields
.iter()
.filter(|f| !f.serde_attrs.skip_deserializing() || !f.serde_attrs.skip_serializing())
.partition(|f| f.serde_attrs.flatten());
let set_container_default = match default {
SerdeDefault::None => None,
SerdeDefault::Default => Some(quote!(let container_default = Self::default();)),
SerdeDefault::Path(path) => Some(quote!(let container_default = #path();)),
};
let properties: Vec<_> = property_fields
.into_iter()
let properties: Vec<_> = fields
.iter()
.filter(|f| !f.serde_attrs.skip_deserializing() || !f.serde_attrs.skip_serializing())
.map(|field| {
let name = field.name();
let default = field_default_expr(field, set_container_default.is_some());
if field.serde_attrs.flatten() {
let (ty, type_def) = type_for_field_schema(field);
let (ty, type_def) = type_for_field_schema(field);
let required = field.validation_attrs.required();
let has_default = default.is_some();
let required = field.validation_attrs.required();
let args = quote!(gen, #required);
let mut schema_expr = quote_spanned! {ty.span()=>
schemars::_private::json_schema_for_flatten::<#ty>(#args)
};
let metadata = SchemaMetadata {
read_only: field.serde_attrs.skip_deserializing(),
write_only: field.serde_attrs.skip_serializing(),
default,
..field.attrs.as_metadata()
};
prepend_type_def(type_def, &mut schema_expr);
let gen = quote!(gen);
let mut schema_expr = if field.validation_attrs.required() {
quote_spanned! {ty.span()=>
<#ty as schemars::JsonSchema>::_schemars_private_non_optional_json_schema(#gen)
quote! {
schemars::_private::flatten(&mut schema, #schema_expr);
}
} else {
quote_spanned! {ty.span()=>
#gen.subschema_for::<#ty>()
}
};
let name = field.name();
let default = field_default_expr(field, set_container_default.is_some());
metadata.apply_to_schema(&mut schema_expr);
field.validation_attrs.apply_to_schema(&mut schema_expr);
let (ty, type_def) = type_for_field_schema(field);
quote! {
{
#type_def
schemars::_private::insert_object_property::<#ty>(&mut schema, #name, #has_default, #required, #schema_expr);
}
}
})
.collect();
let has_default = default.is_some();
let required = field.validation_attrs.required();
let flattens: Vec<_> = flattened_fields
.into_iter()
.map(|field| {
let (ty, type_def) = type_for_field_schema(field);
let metadata = SchemaMetadata {
read_only: field.serde_attrs.skip_deserializing(),
write_only: field.serde_attrs.skip_serializing(),
default,
..field.attrs.as_metadata()
};
let required = field.validation_attrs.required();
let gen = quote!(gen);
let mut schema_expr = if field.validation_attrs.required() {
quote_spanned! {ty.span()=>
<#ty as schemars::JsonSchema>::_schemars_private_non_optional_json_schema(#gen)
}
} else {
quote_spanned! {ty.span()=>
#gen.subschema_for::<#ty>()
}
};
let args = quote!(gen, #required);
let mut schema_expr = quote_spanned! {ty.span()=>
schemars::_private::json_schema_for_flatten::<#ty>(#args)
};
metadata.apply_to_schema(&mut schema_expr);
field.validation_attrs.apply_to_schema(&mut schema_expr);
prepend_type_def(type_def, &mut schema_expr);
schema_expr
})
quote! {
{
#type_def
schemars::_private::insert_object_property::<#ty>(&mut schema, #name, #has_default, #required, #schema_expr);
}
}}
})
.collect();
let set_additional_properties = if deny_unknown_fields {
@ -510,17 +505,16 @@ fn expr_for_struct(
} else {
TokenStream::new()
};
quote! {
{
#set_container_default
let mut schema = schemars::json_schema!({
"type": "object",
#set_additional_properties
});
#(#properties)*
schema #(.flatten(#flattens))*
}
}
quote! ({
#set_container_default
let mut schema = schemars::json_schema!({
"type": "object",
#set_additional_properties
});
#(#properties)*
schema
})
}
fn field_default_expr(field: &Field, container_has_default: bool) -> Option<TokenStream> {