Refactor impl_outgoing_with_incoming_self and add struct variant

This commit is contained in:
Devin Ragotzy 2020-08-01 10:30:55 -04:00 committed by Jonas Platte
parent f0fb9a69c0
commit 2fbdd674ab
2 changed files with 11 additions and 18 deletions

View File

@ -1,4 +1,4 @@
use proc_macro2::{Ident, Span, TokenStream}; use proc_macro2::{Span, TokenStream};
use quote::{format_ident, quote}; use quote::{format_ident, quote};
use syn::{ use syn::{
parse_quote, AngleBracketedGenericArguments, Attribute, Data, DeriveInput, Field, Fields, parse_quote, AngleBracketedGenericArguments, Attribute, Data, DeriveInput, Field, Fields,
@ -14,6 +14,7 @@ enum StructKind {
enum DataKind { enum DataKind {
Struct(Vec<Field>, StructKind), Struct(Vec<Field>, StructKind),
Enum(Vec<Variant>), Enum(Vec<Variant>),
Unit,
} }
pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> { pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
@ -23,7 +24,7 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
quote!(::ruma_api::exports::serde::Deserialize) 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::Union(_) => panic!("#[derive(Outgoing)] does not support Union types"),
Data::Enum(e) => DataKind::Enum(e.variants.into_iter().collect()), Data::Enum(e) => DataKind::Enum(e.variants.into_iter().collect()),
Data::Struct(s) => match s.fields { Data::Struct(s) => match s.fields {
@ -33,11 +34,12 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
Fields::Unnamed(fs) => { Fields::Unnamed(fs) => {
DataKind::Struct(fs.unnamed.into_iter().collect(), StructKind::Tuple) 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 { match data {
DataKind::Unit => Ok(impl_outgoing_with_incoming_self(&input)),
DataKind::Enum(mut vars) => { DataKind::Enum(mut vars) => {
let mut any_attribute = false; let mut any_attribute = false;
for var in &mut vars { for var in &mut vars {
@ -52,11 +54,7 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
let (original_impl_gen, original_ty_gen, _) = input.generics.split_for_impl(); let (original_impl_gen, original_ty_gen, _) = input.generics.split_for_impl();
if !any_attribute { if !any_attribute {
return Ok(impl_outgoing_with_incoming_self( return Ok(impl_outgoing_with_incoming_self(&input));
original_ident,
Some(original_impl_gen),
Some(original_ty_gen),
));
} }
let vis = input.vis; let vis = input.vis;
@ -88,11 +86,7 @@ pub fn expand_derive_outgoing(input: DeriveInput) -> syn::Result<TokenStream> {
let (original_impl_gen, original_ty_gen, _) = input.generics.split_for_impl(); let (original_impl_gen, original_ty_gen, _) = input.generics.split_for_impl();
if !any_attribute { if !any_attribute {
return Ok(impl_outgoing_with_incoming_self( return Ok(impl_outgoing_with_incoming_self(&input));
original_ident,
Some(original_impl_gen),
Some(original_ty_gen),
));
} }
let vis = input.vis; 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")) attrs.iter().any(|attr| attr.path.is_ident("incoming_no_deserialize"))
} }
fn impl_outgoing_with_incoming_self( fn impl_outgoing_with_incoming_self(input: &DeriveInput) -> TokenStream {
ident: &Ident, let ident = &input.ident;
impl_gen: Option<ImplGenerics>, let (impl_gen, ty_gen, _) = input.generics.split_for_impl();
ty_gen: Option<TypeGenerics>,
) -> TokenStream {
quote! { quote! {
impl #impl_gen ::ruma_api::Outgoing for #ident #ty_gen { impl #impl_gen ::ruma_api::Outgoing for #ident #ty_gen {
type Incoming = Self; type Incoming = Self;

View File

@ -32,4 +32,5 @@ pub enum EnumThing<'a, T> {
Stuff(Thing<'a, T>), Stuff(Thing<'a, T>),
Boxy(&'a ::ruma_identifiers::DeviceId), Boxy(&'a ::ruma_identifiers::DeviceId),
Other(Option<&'a str>), Other(Option<&'a str>),
StructVar { stuff: &'a str, more: &'a ::ruma_identifiers::ServerName },
} }