Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 27 additions & 4 deletions strong-xml-derive/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Self> {
Expand All @@ -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<W: std::io::Write>(
&self,
mut writer: &mut strong_xml::XmlWriter<W>
Expand Down