feat: add support for rmp-serde
This commit is contained in:
committed by
Vincent Herlemont
parent
736eb712f4
commit
646673efda
@@ -1,19 +1,48 @@
|
||||
use bincode_1_3::{deserialize, serialize, Error};
|
||||
use serde::{Deserialize, Serialize};
|
||||
//! ⚠️ [`Read the docs before using`](crate::bincode_1_3::Bincode#warning).
|
||||
//! Annotate your type with `native_model::bincode_1_3::Bincode` to use the
|
||||
//! bincode 1.3 crate for serializing & deserializing.
|
||||
|
||||
/// Used to specify the [bincode](https://crates.io/crates/bincode/1.3.3) `1.3`
|
||||
/// crate for serialization & deserialization.
|
||||
///
|
||||
/// # Warning
|
||||
///
|
||||
/// `bincode` [does not implement](https://github.com/bincode-org/bincode/issues/548)
|
||||
/// all [serde](https://crates.io/crates/serde) features. Errors may be
|
||||
/// encountered when using this with some types.
|
||||
///
|
||||
/// # Basic usage
|
||||
///
|
||||
/// Use the [`with`](crate::native_model) attribute on your type to instruct
|
||||
/// `native_model` to use `Bincode` for serialization & deserialization.
|
||||
///
|
||||
/// Example:
|
||||
///
|
||||
/// ```rust
|
||||
/// #[native_model(id = 1, version = 1, with = native_model::bincode_1_3::Bincode)]
|
||||
/// struct MyStruct {
|
||||
/// my_string: String
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
#[doc(cfg(all(feature = "serde", feature = "bincode_1_3")))]
|
||||
#[derive(Default)]
|
||||
pub struct Bincode;
|
||||
|
||||
impl<T: Serialize> super::Encode<T> for Bincode {
|
||||
type Error = Error;
|
||||
fn encode(obj: &T) -> Result<Vec<u8>, Error> {
|
||||
Ok(serialize(obj)?)
|
||||
#[cfg(all(feature = "serde", feature = "bincode_1_3"))]
|
||||
impl<T: serde::Serialize> super::Encode<T> for Bincode {
|
||||
type Error = bincode_1_3::Error;
|
||||
/// Serializes a type into bytes using the `bincode` `1.3` crate.
|
||||
fn encode(obj: &T) -> Result<Vec<u8>, Self::Error> {
|
||||
bincode_1_3::serialize(obj)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: for<'a> Deserialize<'a>> super::Decode<T> for Bincode {
|
||||
type Error = Error;
|
||||
fn decode(data: Vec<u8>) -> Result<T, Error> {
|
||||
Ok(deserialize(&data[..])?)
|
||||
#[cfg(all(feature = "serde", feature = "bincode_1_3"))]
|
||||
impl<T: for<'de> serde::Deserialize<'de>> super::Decode<T> for Bincode {
|
||||
type Error = bincode_1_3::Error;
|
||||
/// Deserializes a type from bytes using the `bincode` `1.3` crate.
|
||||
fn decode(data: Vec<u8>) -> Result<T, Self::Error> {
|
||||
bincode_1_3::deserialize(&data[..])
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,53 @@
|
||||
use bincode_2_rc::{
|
||||
config,
|
||||
error::{DecodeError, EncodeError},
|
||||
serde::{decode_from_slice, encode_to_vec},
|
||||
};
|
||||
use serde::{Deserialize, Serialize};
|
||||
//! ⚠️ [`Read the docs before using`](crate::bincode_2_rc::Bincode#warning).
|
||||
//! Annotate your type with `native_model::bincode_2_rc::Bincode` to use
|
||||
//! the bincode 2.0.0-rc.3 crate for serializing & deserializing.
|
||||
|
||||
/// Used to specify the [bincode](https://crates.io/crates/bincode/2.0.0-rc.3)
|
||||
/// `2.0.0-rc.3` crate for serialization & deserialization.
|
||||
///
|
||||
/// # Warning
|
||||
///
|
||||
/// `bincode` [does not implement](https://docs.rs/bincode/2.0.0-rc.3/bincode/serde/index.html#known-issues)
|
||||
/// all [serde](https://crates.io/crates/serde) features. Errors may be
|
||||
/// encountered when using this with some types.
|
||||
///
|
||||
/// # Basic usage
|
||||
///
|
||||
/// Use the [`with`](crate::native_model) attribute on your type to instruct
|
||||
/// `native_model` to use `Bincode` for serialization & deserialization.
|
||||
///
|
||||
/// Example:
|
||||
///
|
||||
/// ```rust
|
||||
/// #[native_model(id = 1, version = 1, with = native_model::bincode_2_rc::Bincode)]
|
||||
/// struct MyStruct {
|
||||
/// my_string: String
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
#[doc(cfg(all(feature = "serde", feature = "bincode_2_rc")))]
|
||||
pub struct Bincode;
|
||||
|
||||
impl<T: Serialize> super::Encode<T> for Bincode {
|
||||
type Error = EncodeError;
|
||||
fn encode(obj: &T) -> Result<Vec<u8>, EncodeError> {
|
||||
encode_to_vec(obj, config::standard())
|
||||
#[cfg(all(feature = "serde", feature = "bincode_2_rc"))]
|
||||
impl<T: serde::Serialize> super::Encode<T> for Bincode {
|
||||
type Error = bincode_2_rc::error::EncodeError;
|
||||
/// Serializes a type into bytes using the `bincode` `2.0.0-rc.3` crate.
|
||||
fn encode(obj: &T) -> Result<Vec<u8>, Self::Error> {
|
||||
bincode_2_rc::serde::encode_to_vec(
|
||||
obj,
|
||||
bincode_2_rc::config::standard()
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: for<'a> Deserialize<'a>> super::Decode<T> for Bincode {
|
||||
type Error = DecodeError;
|
||||
fn decode(data: Vec<u8>) -> Result<T, DecodeError> {
|
||||
Ok(decode_from_slice(&data, config::standard())?.0)
|
||||
#[cfg(all(feature = "serde", feature = "bincode_2_rc"))]
|
||||
impl<T: for<'de> serde::Deserialize<'de>> super::Decode<T> for Bincode {
|
||||
type Error = bincode_2_rc::error::DecodeError;
|
||||
/// Deserializes a type from bytes using the `bincode` `2.0.0-rc.3` crate.
|
||||
fn decode(data: Vec<u8>) -> Result<T, Self::Error> {
|
||||
Ok(bincode_2_rc::serde::decode_from_slice(
|
||||
&data,
|
||||
bincode_2_rc::config::standard()
|
||||
)?.0)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
#[cfg(all(feature = "serde", feature = "bincode_1_3"))]
|
||||
//! Traits and implementations for encoding types into a series of bytes and
|
||||
//! decoding bytes back into types.
|
||||
|
||||
#[cfg(any(all(feature = "serde", feature = "bincode_1_3"), doc))]
|
||||
pub mod bincode_1_3;
|
||||
#[cfg(all(feature = "serde", feature = "bincode_2_rc"))]
|
||||
#[cfg(any(all(feature = "serde", feature = "bincode_2_rc"), doc))]
|
||||
pub mod bincode_2_rc;
|
||||
#[cfg(all(feature = "serde", feature = "postcard_1_0"))]
|
||||
#[cfg(any(all(feature = "serde", feature = "postcard_1_0"), doc))]
|
||||
pub mod postcard_1_0;
|
||||
#[cfg(any(all(feature = "serde", feature = "rmp_serde_1_3"), doc))]
|
||||
pub mod rmp_serde_1_3;
|
||||
|
||||
/// Encode trait for your own encoding method.
|
||||
///
|
||||
|
||||
@@ -1,18 +1,46 @@
|
||||
use postcard_1_0::{from_bytes, to_allocvec, Error};
|
||||
use serde::{Deserialize, Serialize};
|
||||
//! ⚠️ [`Read the docs before using`](crate::postcard_1_0::PostCard#warning).
|
||||
//! Annotate your type with `native_model::postcard_1_0::PostCard` to
|
||||
//! use the postcard 1.0 crate for serializing & deserializing.
|
||||
|
||||
/// Used to specify the [postcard](https://crates.io/crates/postcard/1.0.8)
|
||||
/// `1.0` crate for serialization & deserialization.
|
||||
///
|
||||
/// # Warning
|
||||
///
|
||||
/// `postcard` does not implement all [serde](https://crates.io/crates/serde)
|
||||
/// features. Errors may be encountered when using this with some types.
|
||||
///
|
||||
/// # Basic usage
|
||||
///
|
||||
/// Use the [`with`](crate::native_model) attribute on your type to instruct
|
||||
/// `native_model` to use `PostCard` for serialization & deserialization.
|
||||
///
|
||||
/// Example:
|
||||
///
|
||||
/// ```rust
|
||||
/// #[native_model(id = 1, version = 1, with = native_model::postcard_1_0::PostCard)]
|
||||
/// struct MyStruct {
|
||||
/// my_string: String
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
#[doc(cfg(all(feature = "serde", feature = "postcard_1_0")))]
|
||||
pub struct PostCard;
|
||||
|
||||
impl<T: Serialize> super::Encode<T> for PostCard {
|
||||
type Error = Error;
|
||||
fn encode(obj: &T) -> Result<Vec<u8>, Error> {
|
||||
Ok(to_allocvec(obj)?)
|
||||
#[cfg(all(feature = "serde", feature = "postcard_1_0"))]
|
||||
impl<T: serde::Serialize> super::Encode<T> for PostCard {
|
||||
type Error = postcard_1_0::Error;
|
||||
/// Serializes a type into bytes using the `postcard` `1.0` crate.
|
||||
fn encode(obj: &T) -> Result<Vec<u8>, Self::Error> {
|
||||
postcard_1_0::to_allocvec(obj)
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: for<'a> Deserialize<'a>> super::Decode<T> for PostCard {
|
||||
type Error = Error;
|
||||
fn decode(data: Vec<u8>) -> Result<T, Error> {
|
||||
Ok(from_bytes(&data)?)
|
||||
#[cfg(all(feature = "serde", feature = "postcard_1_0"))]
|
||||
impl<T: for<'de> serde::Deserialize<'de>> super::Decode<T> for PostCard {
|
||||
type Error = postcard_1_0::Error;
|
||||
/// Deserializes a type from bytes using the `postcard` `1.0` crate.
|
||||
fn decode(data: Vec<u8>) -> Result<T, Self::Error> {
|
||||
postcard_1_0::from_bytes(&data)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
//! [`Annotate your type`](crate::native_model) with
|
||||
//! `native_model::rmp_serde_1_3::RmpSerde` to use the rmp-serde 1.3 crate for
|
||||
//! serializing & deserializing.
|
||||
|
||||
/// Used to specify the [rmp-serde](https://crates.io/crates/rmp-serde/1.3.0)
|
||||
/// `1.3` crate for serialization & deserialization.
|
||||
///
|
||||
/// # Basic usage
|
||||
///
|
||||
/// Use the [`with`](crate::native_model) attribute on your type to instruct
|
||||
/// `native_model` to use `RmpSerde` for serialization & deserialization.
|
||||
///
|
||||
/// Example:
|
||||
///
|
||||
/// ```rust
|
||||
/// #[native_model(id = 1, version = 1, with = native_model::rmp_serde_1_3::RmpSerde)]
|
||||
/// struct MyStruct {
|
||||
/// my_string: String
|
||||
/// }
|
||||
/// ```
|
||||
|
||||
#[doc(cfg(all(feature = "serde", feature = "rmp_serde_1_3")))]
|
||||
pub struct RmpSerde;
|
||||
|
||||
#[cfg(all(feature = "serde", feature = "rmp_serde_1_3"))]
|
||||
impl<T: serde::Serialize> crate::Encode<T> for RmpSerde {
|
||||
type Error = rmp_serde_1_3::encode::Error;
|
||||
/// Serializes a type into bytes using the `rmp-serde` `1.3` crate.
|
||||
fn encode(obj: &T) -> Result<Vec<u8>, Self::Error> {
|
||||
rmp_serde_1_3::encode::to_vec(obj)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "serde", feature = "rmp_serde_1_3"))]
|
||||
impl<T: for<'de> serde::Deserialize<'de>> crate::Decode<T> for RmpSerde {
|
||||
type Error = rmp_serde_1_3::decode::Error;
|
||||
/// Deserializes a type from bytes using the `rmp-serde` `1.3` crate.
|
||||
fn decode(data: Vec<u8>) -> Result<T, Self::Error> {
|
||||
rmp_serde_1_3::decode::from_slice(&data)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user