Refactor flatten
and move it to _private
, remove TempFixupForTests
, regenerate test schemas
This commit is contained in:
parent
18300c67bb
commit
c4d42ec11a
45 changed files with 280 additions and 330 deletions
|
@ -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> {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue