Fix support for tuple structs in Outgoing derive
This commit is contained in:
parent
9fa1305e65
commit
3696516679
@ -11,6 +11,11 @@ mod wrap_incoming;
|
|||||||
|
|
||||||
use wrap_incoming::Meta;
|
use wrap_incoming::Meta;
|
||||||
|
|
||||||
|
enum StructKind {
|
||||||
|
Struct,
|
||||||
|
Tuple,
|
||||||
|
}
|
||||||
|
|
||||||
pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
|
pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
|
||||||
if !input.generics.params.is_empty() {
|
if !input.generics.params.is_empty() {
|
||||||
return Err(syn::Error::new_spanned(
|
return Err(syn::Error::new_spanned(
|
||||||
@ -25,13 +30,17 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
|
|||||||
quote!(#[derive(ruma_api::exports::serde::Deserialize)])
|
quote!(#[derive(ruma_api::exports::serde::Deserialize)])
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut fields: Vec<_> = match input.data {
|
let (mut fields, struct_kind): (Vec<_>, _) = match input.data {
|
||||||
Data::Enum(_) | Data::Union(_) => {
|
Data::Enum(_) | Data::Union(_) => {
|
||||||
panic!("#[derive(Outgoing)] is only supported for structs")
|
panic!("#[derive(Outgoing)] is only supported for structs")
|
||||||
}
|
}
|
||||||
Data::Struct(s) => match s.fields {
|
Data::Struct(s) => match s.fields {
|
||||||
Fields::Named(fs) => fs.named.into_pairs().map(Pair::into_value).collect(),
|
Fields::Named(fs) => {
|
||||||
Fields::Unnamed(fs) => fs.unnamed.into_pairs().map(Pair::into_value).collect(),
|
(fs.named.into_pairs().map(Pair::into_value).collect(), StructKind::Struct)
|
||||||
|
}
|
||||||
|
Fields::Unnamed(fs) => {
|
||||||
|
(fs.unnamed.into_pairs().map(Pair::into_value).collect(), StructKind::Tuple)
|
||||||
|
}
|
||||||
Fields::Unit => return Ok(impl_outgoing_with_incoming_self(input.ident)),
|
Fields::Unit => return Ok(impl_outgoing_with_incoming_self(input.ident)),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -76,12 +85,15 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
|
|||||||
let original_ident = input.ident;
|
let original_ident = input.ident;
|
||||||
let incoming_ident = Ident::new(&format!("Incoming{}", original_ident), Span::call_site());
|
let incoming_ident = Ident::new(&format!("Incoming{}", original_ident), Span::call_site());
|
||||||
|
|
||||||
|
let struct_def = match struct_kind {
|
||||||
|
StructKind::Struct => quote! { { #(#fields,)* } },
|
||||||
|
StructKind::Tuple => quote! { ( #(#fields,)* ); },
|
||||||
|
};
|
||||||
|
|
||||||
Ok(quote! {
|
Ok(quote! {
|
||||||
#[doc = #doc]
|
#[doc = #doc]
|
||||||
#derive_deserialize
|
#derive_deserialize
|
||||||
#vis struct #incoming_ident {
|
#vis struct #incoming_ident #struct_def
|
||||||
#(#fields,)*
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ruma_api::Outgoing for #original_ident {
|
impl ruma_api::Outgoing for #original_ident {
|
||||||
type Incoming = #incoming_ident;
|
type Incoming = #incoming_ident;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user