From f99cea0c4b2aa18cb5884b7ef6c84d63f67fccad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C4=93teris=20Pakalns?= Date: Wed, 8 Sep 2021 12:28:33 +0300 Subject: [PATCH] Fix bug in SerdeDerive macro implementation --- serde-diff-derive/src/serde_diff/mod.rs | 3 +++ src/difference.rs | 5 +++++ src/tests.rs | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/serde-diff-derive/src/serde_diff/mod.rs b/serde-diff-derive/src/serde_diff/mod.rs index 561ad27..37185bc 100644 --- a/serde-diff-derive/src/serde_diff/mod.rs +++ b/serde-diff-derive/src/serde_diff/mod.rs @@ -332,6 +332,9 @@ fn generate( match (self, other) { #(#diff_match_arms)* } + if (__changed__) { + ctx.save_exit()?; + } Ok(__changed__) } } diff --git a/src/difference.rs b/src/difference.rs index ec80813..ff84c33 100644 --- a/src/difference.rs +++ b/src/difference.rs @@ -148,6 +148,11 @@ impl<'a, S: SerializeSeq> DiffContext<'a, S> { self.save_command(&DiffCommandRef::Value(value), true, true) } + /// Write exit command + pub fn save_exit(&mut self) -> Result<(), S::Error> { + self.save_command::<()>(&DiffCommandRef::Exit, true, false) + } + /// Stores an arbitrary DiffCommand to be handled by the type. /// Any custom sequence of DiffCommands must be followed by Exit. pub fn save_command<'b, T: Serialize>( diff --git a/src/tests.rs b/src/tests.rs index 082846b..5fccae6 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,7 +1,9 @@ use crate as serde_diff; use crate::{Apply, Diff, SerdeDiff}; use serde::{Deserialize, Serialize}; +use std::collections::HashMap; use std::fmt::Debug; +use std::iter::FromIterator; #[derive(SerdeDiff, Serialize, Deserialize, PartialEq, Debug, Copy, Clone)] struct TestStruct { @@ -15,6 +17,9 @@ fn roundtrip Deserialize<'a> + PartialEq + De ) { let diff = Diff::serializable(&old, &new); let json_diff = serde_json::to_string(&diff).unwrap(); + + println!("{}", json_diff); + let mut deserializer = serde_json::Deserializer::from_str(&json_diff); let mut target = old.clone(); Apply::apply(&mut deserializer, &mut target).unwrap(); @@ -59,6 +64,18 @@ fn test_option() { Some(TestStruct { a: 52, b: 32. }), Some(TestStruct { a: 42, b: 12. }), ); + roundtrip( + HashMap::from_iter([ + (1, TestStruct { a: 1, b: 1. }), + (2, TestStruct { a: 2, b: 2. }), + (3, TestStruct { a: 3, b: 3. }), + ]), + HashMap::from_iter([ + (1, TestStruct { a: 1, b: 1. }), + (3, TestStruct { a: 4, b: 4. }), + (4, TestStruct { a: 1, b: 1. }), + ]), + ); partial( Some(TestStruct { a: 5, b: 2. }),