Skip to content

Commit

Permalink
Implement serde support.
Browse files Browse the repository at this point in the history
Closes #31.
  • Loading branch information
orium committed Feb 20, 2024
1 parent 37c6df2 commit cd19fa8
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 2 deletions.
7 changes: 5 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,16 +41,19 @@ codecov = { repository = "orium/archery", branch = "main", service = "github" }

[dependencies]
static_assertions = "1.1.0"
triomphe = { version = "0.1.9", default-features = false, optional = true }
triomphe = { version = "0.1.9", optional = true, default-features = false }
serde = { version = "1.0.197", optional = true, default-features = false }

[dev-dependencies]
criterion = { version = "0.5.1", features = ["html_reports"] }
pretty_assertions = "1.2.1"
compiletest_rs = "0.10.2"
bincode = "1.3.3"

[features]
fatal-warnings = []
triomphe = ["dep:triomphe"]
serde = ["dep:serde"]

[lints.clippy]
all = { level = "warn", priority = -1 }
Expand Down Expand Up @@ -102,4 +105,4 @@ harness = false
required-features = ["triomphe"]

[package.metadata.docs.rs]
features = ["triomphe"]
features = ["triomphe", "serde"]
29 changes: 29 additions & 0 deletions src/shared_pointer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,5 +354,34 @@ where

pub mod kind;

#[cfg(feature = "serde")]
pub mod serde {
use super::*;
use ::serde::de::{Deserialize, Deserializer};
use ::serde::ser::{Serialize, Serializer};

impl<T, P> Serialize for SharedPointer<T, P>
where
T: Serialize,
P: SharedPointerKind,
{
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.as_ref().serialize(serializer)
}
}

impl<'de, T, P> Deserialize<'de> for SharedPointer<T, P>
where
T: Deserialize<'de>,
P: SharedPointerKind,
{
fn deserialize<D: Deserializer<'de>>(
deserializer: D,
) -> Result<SharedPointer<T, P>, D::Error> {
T::deserialize(deserializer).map(SharedPointer::new)
}
}
}

#[cfg(test)]
mod test;
11 changes: 11 additions & 0 deletions src/shared_pointer/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,3 +290,14 @@ fn test_display() {

assert_eq!(format!("{ptr}"), "hello");
}

#[cfg(feature = "serde")]
#[test]
fn test_serde() {
use bincode::{deserialize, serialize};
let ptr: SharedPointer<_, RcK> = SharedPointer::new("hello");
let encoded = serialize(&ptr).unwrap();
let decoded: SharedPointer<_, RcK> = deserialize(&encoded).unwrap();

pretty_assertions::assert_eq!(ptr, decoded);
}

0 comments on commit cd19fa8

Please sign in to comment.