diff --git a/ruma-api-macros/src/derive_outgoing.rs b/ruma-api-macros/src/derive_outgoing.rs index c5a11967..5f914372 100644 --- a/ruma-api-macros/src/derive_outgoing.rs +++ b/ruma-api-macros/src/derive_outgoing.rs @@ -1,4 +1,4 @@ -use proc_macro2::{Ident, Span, TokenStream}; +use proc_macro2::{Span, TokenStream}; use quote::{format_ident, quote}; use syn::{ parse_quote, AngleBracketedGenericArguments, Attribute, Data, DeriveInput, Field, Fields, @@ -14,6 +14,7 @@ enum StructKind { enum DataKind { Struct(Vec, StructKind), Enum(Vec), + Unit, } pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result { @@ -23,7 +24,7 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result { quote!(::ruma_api::exports::serde::Deserialize) }; - let data = match input.data { + let data = match input.data.clone() { Data::Union(_) => panic!("#[derive(Outgoing)] does not support Union types"), Data::Enum(e) => DataKind::Enum(e.variants.into_iter().collect()), Data::Struct(s) => match s.fields { @@ -33,11 +34,12 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result { Fields::Unnamed(fs) => { DataKind::Struct(fs.unnamed.into_iter().collect(), StructKind::Tuple) } - Fields::Unit => return Ok(impl_outgoing_with_incoming_self(&input.ident, None, None)), + Fields::Unit => DataKind::Unit, }, }; match data { + DataKind::Unit => Ok(impl_outgoing_with_incoming_self(&input)), DataKind::Enum(mut vars) => { let mut any_attribute = false; for var in &mut vars { @@ -52,11 +54,7 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result { let (original_impl_gen, original_ty_gen, _) = input.generics.split_for_impl(); if !any_attribute { - return Ok(impl_outgoing_with_incoming_self( - original_ident, - Some(original_impl_gen), - Some(original_ty_gen), - )); + return Ok(impl_outgoing_with_incoming_self(&input)); } let vis = input.vis; @@ -88,11 +86,7 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result { let (original_impl_gen, original_ty_gen, _) = input.generics.split_for_impl(); if !any_attribute { - return Ok(impl_outgoing_with_incoming_self( - original_ident, - Some(original_impl_gen), - Some(original_ty_gen), - )); + return Ok(impl_outgoing_with_incoming_self(&input)); } let vis = input.vis; @@ -124,11 +118,9 @@ fn no_deserialize_in_attrs(attrs: &[Attribute]) -> bool { attrs.iter().any(|attr| attr.path.is_ident("incoming_no_deserialize")) } -fn impl_outgoing_with_incoming_self( - ident: &Ident, - impl_gen: Option, - ty_gen: Option, -) -> TokenStream { +fn impl_outgoing_with_incoming_self(input: &DeriveInput) -> TokenStream { + let ident = &input.ident; + let (impl_gen, ty_gen, _) = input.generics.split_for_impl(); quote! { impl #impl_gen ::ruma_api::Outgoing for #ident #ty_gen { type Incoming = Self; diff --git a/ruma-api/tests/outgoing.rs b/ruma-api/tests/outgoing.rs index 3805693d..41e8aa1c 100644 --- a/ruma-api/tests/outgoing.rs +++ b/ruma-api/tests/outgoing.rs @@ -32,4 +32,5 @@ pub enum EnumThing<'a, T> { Stuff(Thing<'a, T>), Boxy(&'a ::ruma_identifiers::DeviceId), Other(Option<&'a str>), + StructVar { stuff: &'a str, more: &'a ::ruma_identifiers::ServerName }, }