Skip to content
Merged
Show file tree
Hide file tree
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
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ exclude = [

[workspace.package]
authors = ["Antonio Yang <yanganto@gmail.com>"]
version = "0.14.2"
version = "0.14.3"
edition = "2021"
categories = ["development-tools"]
keywords = ["struct", "patch", "macro", "derive", "overlay"]
Expand Down
149 changes: 76 additions & 73 deletions derive/src/filler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -247,27 +247,25 @@ impl Filler {
#[cfg(not(feature = "op"))]
let op_impl = quote!();

#[cfg(feature = "nesting")]
let make_log_calls = |names: &[Option<&Ident>]| -> Vec<TokenStream> {
if let Some(f) = default_log_fn {
names
.iter()
.map(|n| quote! { #f(&[], stringify!(#n)); })
.collect()
} else {
names.iter().map(|_| quote! {}).collect()
}
};
#[cfg(not(feature = "nesting"))]
// Per-field log-call token streams, parallel with each field-name vec.
let make_log_calls = |names: &[Option<&Ident>]| -> Vec<TokenStream> {
if let Some(f) = default_log_fn {
names
.iter()
.map(|n| quote! { #f(stringify!(#n)); })
.collect()
} else {
names.iter().map(|_| quote! {}).collect()
#[cfg(feature = "nesting")]
{
return names
.iter()
.map(|n| quote! { #f(&[], stringify!(#n)); })
.collect();
}
#[cfg(not(feature = "nesting"))]
{
return names
.iter()
.map(|n| quote! { #f(stringify!(#n)); })
.collect();
}
}
names.iter().map(|_| quote! {}).collect()
};
let native_value_log_calls = make_log_calls(&native_value_field_names);
let extendable_log_calls = make_log_calls(&extendable_field_names);
Expand All @@ -293,6 +291,65 @@ impl Filler {
#[cfg(not(feature = "nesting"))]
let nesting_apply_section: TokenStream = quote! {};

#[cfg(not(feature = "nesting"))]
let apply_with_log_impl = quote! {
fn apply_with_log<__L: FnMut(&str)>(&mut self, filler: #name #generics, mut log: __L) {
#(
if self.#native_value_field_names == #native_value_field_empty_values {
log(stringify!(#native_value_field_names));
self.#native_value_field_names = filler.#native_value_field_names;
}
)*
#(
if self.#extendable_field_names.is_empty() {
log(stringify!(#extendable_field_names));
self.#extendable_field_names.extend(filler.#extendable_field_names.into_iter());
}
)*
#(
if let Some(v) = filler.#option_field_names {
if self.#option_field_names.is_none() {
log(stringify!(#option_field_names));
self.#option_field_names = Some(v);
}
}
)*
}
};
#[cfg(feature = "nesting")]
let apply_with_log_impl = quote! {
fn apply_with_log<__L: FnMut(&[&str], &str)>(&mut self, filler: #name #generics, mut log: __L) {
#(
if self.#native_value_field_names == #native_value_field_empty_values {
log(&[], stringify!(#native_value_field_names));
self.#native_value_field_names = filler.#native_value_field_names;
}
)*
#(
if self.#extendable_field_names.is_empty() {
log(&[], stringify!(#extendable_field_names));
self.#extendable_field_names.extend(filler.#extendable_field_names.into_iter());
}
)*
#(
if let Some(v) = filler.#option_field_names {
if self.#option_field_names.is_none() {
log(&[], stringify!(#option_field_names));
self.#option_field_names = Some(v);
}
}
)*
#(
let nesting_field_name = stringify!(#nesting_field_names);
self.#nesting_field_names.apply_with_log(filler.#nesting_field_names, |prefixes: &[&str], field: &str| {
let mut new_prefixes = Vec::from(prefixes);
new_prefixes.push(nesting_field_name);
log(&new_prefixes, field);
});
)*
}
};

let filler_impl = quote! {
#[automatically_derived]
impl #generics struct_patch::traits::Filler< #name #generics > for #struct_name #generics #where_clause {
Expand Down Expand Up @@ -320,61 +377,7 @@ impl Filler {
#nesting_apply_section
}

#[cfg(not(feature = "nesting"))]
fn apply_with_log<__L: FnMut(&str)>(&mut self, filler: #name #generics, mut log: __L) {
#(
if self.#native_value_field_names == #native_value_field_empty_values {
log(stringify!(#native_value_field_names));
self.#native_value_field_names = filler.#native_value_field_names;
}
)*
#(
if self.#extendable_field_names.is_empty() {
log(stringify!(#extendable_field_names));
self.#extendable_field_names.extend(filler.#extendable_field_names.into_iter());
}
)*
#(
if let Some(v) = filler.#option_field_names {
if self.#option_field_names.is_none() {
log(stringify!(#option_field_names));
self.#option_field_names = Some(v);
}
}
)*
}

#[cfg(feature = "nesting")]
fn apply_with_log<__L: FnMut(&[&str], &str)>(&mut self, filler: #name #generics, mut log: __L) {
#(
if self.#native_value_field_names == #native_value_field_empty_values {
log(&[], stringify!(#native_value_field_names));
self.#native_value_field_names = filler.#native_value_field_names;
}
)*
#(
if self.#extendable_field_names.is_empty() {
log(&[], stringify!(#extendable_field_names));
self.#extendable_field_names.extend(filler.#extendable_field_names.into_iter());
}
)*
#(
if let Some(v) = filler.#option_field_names {
if self.#option_field_names.is_none() {
log(&[], stringify!(#option_field_names));
self.#option_field_names = Some(v);
}
}
)*
#(
let nesting_field_name = stringify!(#nesting_field_names);
self.#nesting_field_names.apply_with_log(filler.#nesting_field_names, |prefixes: &[&str], field: &str| {
let mut new_prefixes = Vec::from(prefixes);
new_prefixes.push(nesting_field_name);
log(&new_prefixes, field);
});
)*
}
#apply_with_log_impl

fn new_empty_filler() -> #name #generics {
#name {
Expand Down
Loading
Loading