From 89988eb5b479cbf96940ddfc8b0cac72e9b450c7 Mon Sep 17 00:00:00 2001 From: Akash soni <33283321+akashsoni01@users.noreply.github.com> Date: Wed, 2 Jul 2025 00:40:13 +0530 Subject: [PATCH] #10 resolved --- Cargo.toml | 8 +++++++- examples/Serde_example.rs | 31 +++++++++++++++++++++++++++++++ tagged-core/Cargo.toml | 5 +++++ tagged-core/src/lib.rs | 18 ++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 examples/Serde_example.rs diff --git a/Cargo.toml b/Cargo.toml index 4163c61..d5481fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,7 +33,10 @@ members = [ tagged-core = { path = "tagged-core" } [dependencies] -tagged-core = { version = "0.1.0" } # This will use the patched version from local +tagged-core = { path = "tagged-core", version = "0.1.0", features = ["serde"] } +serde = { version = "1.0.219", features = ["derive"] } +#serde = { version = "1.0", features = ["derive"], optional = true} +serde_json = "1.0.140" [workspace.dependencies] #tagged-core = { path = "crates/tagged-core", version = "0.1.0" } @@ -50,6 +53,9 @@ tagged-core = { version = "0.1.0" } # This will use the patched version from loc # crates/tagged-core/Cargo.toml [features] default = [] +serde = ["tagged-core/serde"] +full = ["serde"] +#serde = ["dep:serde"] #serde = ["dep:serde"] #uuid = ["dep:uuid"] #chrono = ["dep:chrono"] diff --git a/examples/Serde_example.rs b/examples/Serde_example.rs new file mode 100644 index 0000000..98c87dc --- /dev/null +++ b/examples/Serde_example.rs @@ -0,0 +1,31 @@ +use serde::{Deserialize, Serialize}; + +fn main() { + use tagged_core::Tagged; + #[derive(Clone, Hash, Debug, PartialEq, Eq, Serialize, Deserialize)] + struct SomeCustomType { + some_id: String + } + #[derive(Clone, Hash, Debug, PartialEq, Eq, Serialize, Deserialize)] + struct SomeCustomType2(String); + #[derive(Clone, Hash, Debug, PartialEq, Eq, Serialize, Deserialize)] + struct User { + id: Tagged, + id2: SomeCustomType, + id3: SomeCustomType2, + } + + let user = User { id: "1".into() , id2: SomeCustomType { some_id: "2".into() }, id3: SomeCustomType2("3".into())}; + let j = serde_json::to_string(&user).unwrap(); + println!("{}", j); +} + +/* +Problem with normal types +{"id":"1","id2":{"some_id":"2"}} + +// rust is powerful enough to solve it using touple +{"id":"1","id2":{"some_id":"2"},"id3":"3"} + +// or we can use a new type called tagged that don't need a new name. +*/ \ No newline at end of file diff --git a/tagged-core/Cargo.toml b/tagged-core/Cargo.toml index 09a201c..c379798 100644 --- a/tagged-core/Cargo.toml +++ b/tagged-core/Cargo.toml @@ -14,3 +14,8 @@ readme = "../README.md" include = ["src/**/*", "Cargo.toml", "../../README.md", "LICENSE"] [dependencies] +serde = { version = "1.0.219", features = ["derive"], optional = true } + +[features] +default = [] +serde = ["dep:serde"] diff --git a/tagged-core/src/lib.rs b/tagged-core/src/lib.rs index 4026ce6..901f598 100644 --- a/tagged-core/src/lib.rs +++ b/tagged-core/src/lib.rs @@ -122,6 +122,24 @@ impl Hash for Tagged { } } + +#[cfg(feature = "serde")] +use serde::{Serialize, Deserialize, Serializer, Deserializer}; + +#[cfg(feature = "serde")] +impl Serialize for Tagged { + fn serialize(&self, serializer: S) -> Result { + self.value().serialize(serializer) + } +} + +#[cfg(feature = "serde")] +impl<'de, T: Deserialize<'de>, Tag> Deserialize<'de> for Tagged { + fn deserialize>(deserializer: D) -> Result { + T::deserialize(deserializer).map(Self::new) + } +} + // For all common primitive types // macro_rules! impl_from_tagged { // ($($t:ty),*) => {