diff --git a/src/bytearray.rs b/src/bytearray.rs index 91202d8..0baaa3a 100644 --- a/src/bytearray.rs +++ b/src/bytearray.rs @@ -62,6 +62,12 @@ impl Debug for ByteArray { } } +impl Default for ByteArray { + fn default() -> Self { + ByteArray { bytes: [0; N] } + } +} + impl AsRef<[u8; N]> for ByteArray { fn as_ref(&self) -> &[u8; N] { &self.bytes @@ -112,6 +118,12 @@ impl BorrowMut for ByteArray { } } +impl From<[u8; N]> for ByteArray { + fn from(bytes: [u8; N]) -> Self { + ByteArray { bytes } + } +} + impl PartialEq for ByteArray where Rhs: ?Sized + Borrow<[u8; N]>, diff --git a/src/bytebuf.rs b/src/bytebuf.rs index 0c2daa6..60fc21d 100644 --- a/src/bytebuf.rs +++ b/src/bytebuf.rs @@ -131,6 +131,17 @@ impl BorrowMut for ByteBuf { } } +impl From for ByteBuf +where + T: Into>, +{ + fn from(bytes: T) -> Self { + ByteBuf { + bytes: bytes.into(), + } + } +} + impl PartialEq for ByteBuf where Rhs: ?Sized + AsRef<[u8]>, diff --git a/src/bytes.rs b/src/bytes.rs index 3842989..474ff20 100644 --- a/src/bytes.rs +++ b/src/bytes.rs @@ -81,6 +81,12 @@ impl DerefMut for Bytes { } } +impl<'a> From<&'a [u8]> for &'a Bytes { + fn from(bytes: &'a [u8]) -> Self { + Bytes::new(bytes) + } +} + #[cfg(any(feature = "std", feature = "alloc"))] impl ToOwned for Bytes { type Owned = ByteBuf; diff --git a/tests/test_derive.rs b/tests/test_derive.rs index 019a7cb..b0d3bd8 100644 --- a/tests/test_derive.rs +++ b/tests/test_derive.rs @@ -138,3 +138,55 @@ fn test() { ], ); } + +#[derive(Serialize, Deserialize, PartialEq, Debug, Default)] +struct TestFrom<'a> { + #[serde(borrow)] + bytes: &'a Bytes, + byte_array: ByteArray<4>, + byte_buf: ByteBuf, +} + +#[test] +fn test_default() { + let mut test = TestFrom::default(); + + assert_tokens( + &test, + &[ + Token::Struct { + name: "TestFrom", + len: 3, + }, + Token::Str("bytes"), + Token::BorrowedBytes(b""), + Token::Str("byte_array"), + Token::Bytes(&[0; 4]), + Token::Str("byte_buf"), + Token::Bytes(b""), + Token::StructEnd, + ], + ); + + let bytes = [255u8; 4]; + test.byte_array = bytes.into(); + test.bytes = bytes.as_slice().into(); + test.byte_buf = bytes.into(); + + assert_tokens( + &test, + &[ + Token::Struct { + name: "TestFrom", + len: 3, + }, + Token::Str("bytes"), + Token::BorrowedBytes(b"\xff\xff\xff\xff"), + Token::Str("byte_array"), + Token::Bytes(&[255u8; 4]), + Token::Str("byte_buf"), + Token::Bytes(b"\xff\xff\xff\xff"), + Token::StructEnd, + ], + ); +}