Skip to content

Commit 5fb4783

Browse files
committed
added rkyv
1 parent 9f2f702 commit 5fb4783

4 files changed

Lines changed: 66 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
55

66
## [0.1.0] - 2023-07-07
77

8-
Initial release.
8+
Initial release.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ repository = "https://github.com/Synphonyte/codee"
1515
base64 = { version = "0.21", optional = true }
1616
bincode = { version = "1", optional = true }
1717
prost = { version = "0.12", optional = true }
18+
rkyv = { version = "0.7", optional = true, features = ["validation", "strict"] }
1819
rmp-serde = { version = "1.1", optional = true }
1920
serde = { version = "1", optional = true }
2021
serde_json = { version = "1", optional = true }

src/binary/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ mod from_to_bytes;
55
mod msgpack_serde;
66
#[cfg(feature = "prost")]
77
mod prost;
8+
#[cfg(feature = "rkyv")]
9+
mod rkyv;
810

911
#[cfg(feature = "bincode_serde")]
1012
pub use bincode_serde::*;
@@ -14,3 +16,5 @@ pub use from_to_bytes::*;
1416
pub use msgpack_serde::*;
1517
#[cfg(feature = "prost")]
1618
pub use prost::*;
19+
#[cfg(feature = "rkyv")]
20+
pub use rkyv::*;

src/binary/rkyv.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
use crate::{Decoder, Encoder};
2+
use rkyv::de::deserializers::SharedDeserializeMap;
3+
use rkyv::ser::serializers::AllocSerializer;
4+
use rkyv::validation::validators::DefaultValidator;
5+
use rkyv::{Archive, CheckBytes, Deserialize, Fallible, Serialize};
6+
use std::error::Error;
7+
use std::sync::Arc;
8+
9+
/// A codec that relies on `rkyv` to encode data in the msgpack format.
10+
///
11+
/// This is only available with the **`rkyv` feature** enabled.
12+
pub struct RkyvCodec;
13+
14+
impl<T> Encoder<T> for RkyvCodec
15+
where
16+
T: Serialize<AllocSerializer<1024>>,
17+
{
18+
type Error = <AllocSerializer<1024> as Fallible>::Error;
19+
type Encoded = Vec<u8>;
20+
21+
fn encode(val: &T) -> Result<Self::Encoded, Self::Error> {
22+
Ok(rkyv::to_bytes::<T, 1024>(val)?.to_vec())
23+
}
24+
}
25+
26+
impl<T> Decoder<T> for RkyvCodec
27+
where
28+
T: Archive,
29+
for<'a> T::Archived:
30+
'a + CheckBytes<DefaultValidator<'a>> + Deserialize<T, SharedDeserializeMap>,
31+
{
32+
type Error = Arc<dyn Error>;
33+
type Encoded = [u8];
34+
35+
fn decode(val: &Self::Encoded) -> Result<T, Self::Error> {
36+
rkyv::from_bytes::<T>(val).map_err(|e| Arc::new(e) as Arc<dyn Error>)
37+
}
38+
}
39+
40+
#[cfg(test)]
41+
mod tests {
42+
use super::*;
43+
44+
#[test]
45+
fn test_rkyv_codec() {
46+
#[derive(Clone, Debug, PartialEq, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)]
47+
#[archive(check_bytes)]
48+
struct Test {
49+
s: String,
50+
i: i32,
51+
}
52+
let t = Test {
53+
s: String::from("party time 🎉"),
54+
i: 42,
55+
};
56+
let enc = RkyvCodec::encode(&t).unwrap();
57+
let dec: Test = RkyvCodec::decode(&enc).unwrap();
58+
assert_eq!(dec, t);
59+
}
60+
}

0 commit comments

Comments
 (0)