Skip to content

Commit

Permalink
Adds serde support.
Browse files Browse the repository at this point in the history
  • Loading branch information
Nathan Ringo committed Jul 30, 2021
1 parent 9e93c18 commit a6d7970
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ script:
- cd gc
- cargo build
- cargo test
- cargo test --features serde
- ([ $TRAVIS_RUST_VERSION != nightly ] || cargo build --features nightly)
- ([ $TRAVIS_RUST_VERSION != nightly ] || cargo test --features nightly)
- ([ $TRAVIS_RUST_VERSION != nightly ] || cargo test --features nightly,serde)
after_success: bash ../upload-docs.sh
env:
global:
Expand Down
2 changes: 2 additions & 0 deletions gc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ derive = ["gc_derive"]

[dependencies]
gc_derive = { path = "../gc_derive", version = "0.4.1", optional = true }
serde = { version = "1.0.0", optional = true }

[dev-dependencies]
gc_derive = { path = "../gc_derive", version = "0.4.1" }
serde_json = { version = "1.0.66" }
2 changes: 2 additions & 0 deletions gc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ use std::marker::Unsize;
use std::ops::CoerceUnsized;

mod gc;
#[cfg(feature = "serde")]
mod serde;
mod trace;

#[cfg(feature = "derive")]
Expand Down
20 changes: 20 additions & 0 deletions gc/src/serde.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
use crate::{Gc, Trace};
use serde::{Deserialize, Deserializer, Serialize, Serializer};

impl<'de, T: Deserialize<'de> + Trace> Deserialize<'de> for Gc<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
T::deserialize(deserializer).map(Gc::new)
}
}

impl<T: Serialize + Trace> Serialize for Gc<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
T::serialize(&self, serializer)
}
}
23 changes: 23 additions & 0 deletions gc/tests/serde.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
#![cfg(feature = "serde")]

use gc::Gc;
use serde_json::json;
use std::collections::HashMap;

type Example = Gc<HashMap<String, Gc<Vec<i32>>>>;

#[test]
fn serde_tests() {
let value = json!({
"hello": [104, 101, 108, 108, 111],
"world": [119, 111, 114, 108, 100],
});

let mut expected = HashMap::new();
expected.insert("hello".to_string(), Gc::new(vec![104, 101, 108, 108, 111]));
expected.insert("world".to_string(), Gc::new(vec![119, 111, 114, 108, 100]));
let expected = Gc::new(expected);

assert_eq!(serde_json::to_value(&expected).unwrap(), value);
assert_eq!(serde_json::from_value::<Example>(value).unwrap(), expected);
}

0 comments on commit a6d7970

Please sign in to comment.