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 7125623
Show file tree
Hide file tree
Showing 5 changed files with 63 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"]
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,15 @@ about it.
To use it you need to enable the `triomphe` feature in `archery`. Use `ArcTK` as the pointer
kind in [`SharedPointer`](https://docs.rs/archery/latest/archery/shared_pointer/struct.SharedPointer.html).

### Serialization

We support serialization through [serde](https://crates.io/crates/serde). To use it
enable the `serde` feature. To do so change the archery dependency in your `Cargo.toml` to

```toml
[dependencies]
archery = { version = "<version>", features = ["serde"] }
```
## Limitations

Currently it is not possible to have unsized types inside a
Expand Down
9 changes: 9 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,15 @@
//! To use it you need to enable the `triomphe` feature in `archery`. Use `ArcTK` as the pointer
//! kind in [`SharedPointer`](crate::shared_pointer::SharedPointer).
//!
//! ## Serialization
//!
//! We support serialization through [serde](https://crates.io/crates/serde). To use it
//! enable the `serde` feature. To do so change the archery dependency in your `Cargo.toml` to
//!
//! ```toml
//! [dependencies]
//! archery = { version = "<version>", features = ["serde"] }
//! ```
//! # Limitations
//!
//! Currently it is not possible to have unsized types inside a
Expand Down
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 7125623

Please sign in to comment.