diff --git a/Cargo.toml b/Cargo.toml index 26e6bcd..c132fc2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ substr-usize-indices = ["substr"] [dependencies] serde = { version = "1", default-features = false, optional = true } +bincode = { version = "2.0.0-rc.2", optional = true } [dev-dependencies] serde_test = { version = "1", default-features = false } diff --git a/src/impl_bincode.rs b/src/impl_bincode.rs new file mode 100644 index 0000000..da93fe9 --- /dev/null +++ b/src/impl_bincode.rs @@ -0,0 +1,101 @@ +//! Implements Decode and Encode traits for use of ArcStr and Substr types with bincode. + +use super::ArcStr; +#[cfg(feature = "substr")] +use super::Substr; + +use alloc::string::String; +use bincode::{Decode, Encode}; +use bincode::error::{DecodeError, EncodeError}; +use bincode::enc::Encoder; +use bincode::de::{BorrowDecode, BorrowDecoder, Decoder}; + +impl Decode for ArcStr { + fn decode(decoder: &mut D) -> Result { + let s: String = bincode::Decode::decode(decoder)?; + Ok(Self::from(s)) + } +} + +impl Encode for ArcStr { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + bincode::Encode::encode(&self.as_str(), encoder)?; + Ok(()) + } +} + +impl<'de> BorrowDecode<'de> for ArcStr { + fn borrow_decode>( + decoder: &mut D + ) -> Result { + let s: String = bincode::BorrowDecode::borrow_decode(decoder)?; + Ok(Self::from(s)) + } +} + +#[cfg(feature = "substr")] +impl Decode for Substr { + fn decode(decoder: &mut D) -> Result { + let s: String = bincode::Decode::decode(decoder)?; + Ok(Self::from(s)) + } +} + +#[cfg(feature = "substr")] +impl Encode for Substr { + fn encode(&self, encoder: &mut E) -> Result<(), EncodeError> { + bincode::Encode::encode(&self.as_str(), encoder)?; + Ok(()) + } +} + +#[cfg(feature = "substr")] +impl<'de> BorrowDecode<'de> for Substr { + fn borrow_decode>( + decoder: &mut D + ) -> Result { + let s: String = bincode::BorrowDecode::borrow_decode(decoder)?; + Ok(Self::from(s)) + } +} + + +#[cfg(test)] +mod tests { + #[test] + fn arcstr_decode_encode() { + use crate::ArcStr; + + let mut slice = [0u8; 14]; + let input = ArcStr::from("Hello, world!"); + + let length = bincode::encode_into_slice( + &input, + &mut slice, + bincode::config::standard() + ).unwrap(); + assert_eq!(length, 14); + + let decoded: ArcStr = bincode::decode_from_slice(&slice, bincode::config::standard()).unwrap().0; + assert_eq!(decoded, input); + } + + #[cfg(feature = "substr")] + #[test] + fn substr_decode_encode() { + use crate::Substr; + + let mut slice = [0u8; 14]; + let input = Substr::from("Hello, world!"); + + let length = bincode::encode_into_slice( + &input, + &mut slice, + bincode::config::standard() + ).unwrap(); + assert_eq!(length, 14); + + let decoded: Substr = bincode::decode_from_slice(&slice, bincode::config::standard()).unwrap().0; + assert_eq!(decoded, input); + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 4f0cae3..63de301 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -76,6 +76,8 @@ mod mac; mod arc_str; #[cfg(feature = "serde")] mod impl_serde; +#[cfg(feature = "bincode")] +mod impl_bincode; pub use arc_str::ArcStr; #[cfg(feature = "substr")]