From 2e3a5474501df3d1f6f0690f3c9c84f293734384 Mon Sep 17 00:00:00 2001 From: qm3ster Date: Sun, 10 May 2020 02:27:35 +0300 Subject: [PATCH] Enable deriving on generic types --- strong-xml-derive/src/lib.rs | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/strong-xml-derive/src/lib.rs b/strong-xml-derive/src/lib.rs index 6d968d9..163d229 100644 --- a/strong-xml-derive/src/lib.rs +++ b/strong-xml-derive/src/lib.rs @@ -21,13 +21,25 @@ pub fn derive_xml_read(input: TokenStream) -> TokenStream { let input_lifetime = utils::gen_input_lifetime(&generics); - let mut generics_with_lifetime = generics.clone(); - generics_with_lifetime.params.push(input_lifetime.into()); + let mut generics_with_lifetime_and_where = generics.clone(); + generics_with_lifetime_and_where + .params + .push(input_lifetime.into()); + generics_with_lifetime_and_where + .make_where_clause() + .predicates + .extend(generics.type_params().map(|t| { + let x: syn::WherePredicate = syn::parse_quote! {#t: strong_xml::XmlRead<'__input>}; + x + })); + + let (_, ty_generics, _) = generics.split_for_impl(); + let (impl_generics, _, where_clause) = generics_with_lifetime_and_where.split_for_impl(); let impl_read = read::impl_read(Element::parse(input.clone())); let gen = quote! { - impl #generics_with_lifetime strong_xml::XmlRead<'__input> for #name #generics { + impl #impl_generics strong_xml::XmlRead<'__input> for #name #ty_generics #where_clause { fn from_reader( mut reader: &mut strong_xml::XmlReader<'__input> ) -> strong_xml::XmlResult { @@ -47,11 +59,22 @@ pub fn derive_xml_write(input: TokenStream) -> TokenStream { let name = &input.ident; let generics = &input.generics; + let mut generics_with_where = generics.clone(); + + generics_with_where + .make_where_clause() + .predicates + .extend(generics.type_params().map(|t| { + let x: syn::WherePredicate = syn::parse_quote! {#t: strong_xml::XmlWrite}; + x + })); + + let (impl_generics, ty_generics, where_clause) = generics_with_where.split_for_impl(); let impl_write = write::impl_write(Element::parse(input.clone())); let gen = quote! { - impl #generics strong_xml::XmlWrite for #name #generics { + impl #impl_generics strong_xml::XmlWrite for #name #ty_generics #where_clause { fn to_writer( &self, mut writer: &mut strong_xml::XmlWriter