1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
extern crate proc_macro; mod serde_diff; /// # Examples /// /// Minimal example of implementing diff support for a struct /// ```rust /// use serde_diff::SerdeDiff; /// use serde::{Serialize, Deserialize}; /// #[derive(SerdeDiff)] /// struct MySimpleStruct { /// val: u32, /// } /// ``` /// /// Example of an opaque (non-recursive diff) implementation of SerdeDiff using `#[serde_diff(opaque)]` on the struct. /// Field types are not required to implement SerdeDiff in this case, only Serialize + Deserialize + PartialEq. /// ```rust /// use serde_diff::SerdeDiff; /// use serde::{Serialize, Deserialize}; /// #[derive(SerdeDiff, Serialize, Deserialize, PartialEq)] /// #[serde_diff(opaque)] /// struct OpaqueTest(i32); /// ``` /// /// Example of a struct with an opaque field using `#[serde_diff(opaque)]` on a field. /// ```rust /// use serde_diff::SerdeDiff; /// use serde::{Serialize, Deserialize}; /// #[derive(SerdeDiff)] /// struct MyInnerStruct { /// #[serde_diff(opaque)] /// heap: std::collections::HashSet<i32>, /// } /// ``` /// /// Example of diffing a target struct `MySimpleStruct` that is being used for serialization instead /// of the struct `MyComplexStruct` itself. Useful for cases where derived data is present at /// runtime, but not wanted in the serialized form. /// ```rust /// use serde_diff::SerdeDiff; /// use serde::{Serialize, Deserialize}; /// #[derive(SerdeDiff, Serialize, Deserialize, Clone)] /// #[serde(from = "MySimpleStruct", into = "MySimpleStruct")] /// #[serde_diff(target = "MySimpleStruct")] /// struct MyComplexStruct { /// val: u32, /// derived_val: String, /// } /// /// #[derive(SerdeDiff, Serialize, Deserialize, Default)] /// #[serde(rename = "MyComplexStruct", default)] /// struct MySimpleStruct { /// val: u32, /// } /// /// impl From<MySimpleStruct> for MyComplexStruct { /// fn from(my_simple_struct: MySimpleStruct) -> Self { /// MyComplexStruct { /// val: my_simple_struct.val, /// derived_val: my_simple_struct.val.to_string(), /// } /// } /// } /// /// impl Into<MySimpleStruct> for MyComplexStruct { /// fn into(self) -> MySimpleStruct { /// MySimpleStruct { /// val: self.val, /// } /// } /// } /// ``` #[proc_macro_derive(SerdeDiff, attributes(serde_diff))] pub fn serde_diff_macro_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { serde_diff::macro_derive(input) }