Refactor impl_outgoing_with_incoming_self and add struct variant
This commit is contained in:
parent
f0fb9a69c0
commit
2fbdd674ab
@ -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;
|
||||||
|
@ -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 },
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user