Skip to content

Commit 57e6866

Browse files
committed
Add Generic Support
1 parent d8d4b1f commit 57e6866

File tree

3 files changed

+28
-6
lines changed

3 files changed

+28
-6
lines changed

examples/struct.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ struct Test2Struct(u32, u32, u32);
1111
#[derive(SerdeDiff, Serialize, Deserialize, PartialEq, Debug)]
1212
struct Test3Struct;
1313

14+
#[derive(SerdeDiff, Serialize, Deserialize, PartialEq, Debug)]
15+
struct Test4Struct<T>
16+
where T: SerdeDiff
17+
{
18+
a: T,
19+
}
20+
1421
fn main() -> Result<(), Box<dyn std::error::Error>> {
1522
{
1623
let old = TestStruct { a: 5, b: 2. };
@@ -52,5 +59,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
5259
let result = Test3Struct;
5360
assert_eq!(result, target);
5461
}
62+
{
63+
let old = Test4Struct { a: 5};
64+
let new = Test4Struct { a: 7};
65+
let mut target = Test4Struct { a: 10};
66+
let json_data = serde_json::to_string(&Diff::serializable(&old, &new))?;
67+
let mut deserializer = serde_json::Deserializer::from_str(&json_data);
68+
Apply::apply(&mut deserializer, &mut target)?;
69+
70+
let result = Test4Struct { a: 7};
71+
assert_eq!(result, target);
72+
}
5573
Ok(())
5674
}

serde-diff-derive/src/serde_diff/args.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ pub struct SerdeDiffStructArgs {
99
/// Whether the struct is opaque or not
1010
#[darling(default)]
1111
pub opaque: bool,
12+
13+
pub generics: syn::Generics,
1214
}
1315

1416
/// Metadata from the struct's field annotations

serde-diff-derive/src/serde_diff/mod.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub fn macro_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
1818
generate_opaque(&input, struct_args)
1919
} else {
2020
// Go ahead and generate the code
21-
match generate_enum(&input, struct_args) {
21+
match generate(&input, struct_args) {
2222
//Ok(v) => {eprintln!("{}", v); v},
2323
Ok(v) => v,
2424
Err(v) => v,
@@ -30,7 +30,7 @@ pub fn macro_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
3030
generate_opaque(&input, struct_args)
3131
} else {
3232
// Go ahead and generate the code
33-
match generate_enum(&input, struct_args) {
33+
match generate(&input, struct_args) {
3434
//Ok(v) => {eprintln!("{}", v); v},
3535
Ok(v) => v,
3636
Err(v) => v,
@@ -63,7 +63,7 @@ struct ParsedField {
6363
field_args: args::SerdeDiffFieldArgs,
6464
}
6565

66-
fn generate_enum_fields_diff(
66+
fn generate_fields_diff(
6767
parsed_fields: &[ParsedField],
6868
matching : bool,
6969
) -> proc_macro2::TokenStream {
@@ -183,7 +183,7 @@ fn generate_arms(name: &syn::Ident, variant: Option<&syn::Ident>, fields: &syn::
183183
let mut diff_match_arms = vec![];
184184
let mut apply_match_arms = vec![];
185185
let parsed_fields = ok_fields(&fields)?;
186-
let diffs = generate_enum_fields_diff(
186+
let diffs = generate_fields_diff(
187187
&parsed_fields,
188188
matching,
189189
);
@@ -292,7 +292,7 @@ fn generate_arms(name: &syn::Ident, variant: Option<&syn::Ident>, fields: &syn::
292292
Ok((diff_match_arms, apply_match_arms))
293293
}
294294

295-
fn generate_enum(
295+
fn generate(
296296
input: &syn::DeriveInput,
297297
struct_args: args::SerdeDiffStructArgs,
298298
) -> Result<proc_macro::TokenStream, proc_macro::TokenStream> {
@@ -379,8 +379,10 @@ fn generate_enum(
379379

380380
// Generate the impl block with the diff and apply functions within it
381381
let struct_name = &struct_args.ident;
382+
let generics = &struct_args.generics.params;
383+
let where_clause = &struct_args.generics.where_clause;
382384
let diff_impl = quote! {
383-
impl serde_diff::SerdeDiff for #struct_name {
385+
impl <#generics> serde_diff::SerdeDiff for #struct_name < #generics> #where_clause {
384386
#diff_fn
385387
#apply_fn
386388
}

0 commit comments

Comments
 (0)