Enable deriving JsonSchema for unit/newtype/tuple structs
This commit is contained in:
parent
07f4f68a02
commit
3f5f7cf0a3
6 changed files with 107 additions and 18 deletions
|
@ -28,9 +28,11 @@ pub fn derive_json_schema(input: proc_macro::TokenStream) -> proc_macro::TokenSt
|
|||
}
|
||||
|
||||
let schema = match cont.data {
|
||||
Data::Struct(Style::Unit, _) => schema_for_unit_struct(),
|
||||
Data::Struct(Style::Newtype, ref fields) => schema_for_newtype_struct(&fields[0]),
|
||||
Data::Struct(Style::Tuple, ref fields) => schema_for_tuple_struct(fields),
|
||||
Data::Struct(Style::Struct, ref fields) => schema_for_struct(fields, &cont.attrs),
|
||||
Data::Enum(ref variants) => schema_for_enum(variants, &cont.attrs),
|
||||
_ => unimplemented!("work in progress!"),
|
||||
};
|
||||
|
||||
let type_name = cont.ident;
|
||||
|
@ -105,7 +107,7 @@ fn schema_for_enum(variants: &[Variant], cattrs: &attr::Container) -> TokenStrea
|
|||
EnumTag::External => schema_for_external_tagged_enum(variants, cattrs),
|
||||
EnumTag::None => schema_for_untagged_enum(variants, cattrs),
|
||||
EnumTag::Internal { tag } => schema_for_internal_tagged_enum(variants, cattrs, tag),
|
||||
EnumTag::Adjacent => unimplemented!("Adjacent tagged enums not yet supported."),
|
||||
EnumTag::Adjacent { .. } => unimplemented!("Adjacent tagged enums not yet supported."),
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -204,26 +206,33 @@ fn schema_for_untagged_enum(variants: &[Variant], cattrs: &attr::Container) -> T
|
|||
|
||||
fn schema_for_untagged_enum_variant(variant: &Variant, cattrs: &attr::Container) -> TokenStream {
|
||||
match variant.style {
|
||||
Style::Unit => quote! {
|
||||
gen.subschema_for::<()>()?
|
||||
},
|
||||
Style::Newtype => {
|
||||
let f = &variant.fields[0];
|
||||
let ty = f.ty;
|
||||
quote_spanned! {f.original.span()=>
|
||||
gen.subschema_for::<#ty>()?
|
||||
}
|
||||
}
|
||||
Style::Tuple => {
|
||||
let types = variant.fields.iter().map(|f| f.ty);
|
||||
quote! {
|
||||
gen.subschema_for::<(#(#types),*)>()?
|
||||
}
|
||||
}
|
||||
Style::Unit => schema_for_unit_struct(),
|
||||
Style::Newtype => schema_for_newtype_struct(&variant.fields[0]),
|
||||
Style::Tuple => schema_for_tuple_struct(&variant.fields),
|
||||
Style::Struct => schema_for_struct(&variant.fields, cattrs),
|
||||
}
|
||||
}
|
||||
|
||||
fn schema_for_unit_struct() -> TokenStream {
|
||||
quote! {
|
||||
gen.subschema_for::<()>()?
|
||||
}
|
||||
}
|
||||
|
||||
fn schema_for_newtype_struct(field: &Field) -> TokenStream {
|
||||
let ty = field.ty;
|
||||
quote_spanned! {field.original.span()=>
|
||||
gen.subschema_for::<#ty>()?
|
||||
}
|
||||
}
|
||||
|
||||
fn schema_for_tuple_struct(fields: &[Field]) -> TokenStream {
|
||||
let types = fields.iter().map(|f| f.ty);
|
||||
quote! {
|
||||
gen.subschema_for::<(#(#types),*)>()?
|
||||
}
|
||||
}
|
||||
|
||||
fn schema_for_struct(fields: &[Field], cattrs: &attr::Container) -> TokenStream {
|
||||
let (nested, flat): (Vec<_>, Vec<_>) = fields.iter().partition(|f| !f.attrs.flatten());
|
||||
let container_has_default = has_default(cattrs.default());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue