From 303e938fd5c2523daa607002eab34aea178df26f Mon Sep 17 00:00:00 2001 From: 0xZensh Date: Fri, 14 Jun 2024 18:41:58 +0800 Subject: [PATCH 1/3] Implement From for ByteArray, ByteBuf and Bytes Signed-off-by: 0xZensh --- src/bytearray.rs | 12 ++++++++++ src/bytebuf.rs | 11 ++++++++++ src/bytes.rs | 6 +++++ tests/test_derive.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) 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, + ], + ); +} From 5a482b48abe6bbc21384f640ef7ca7220a9423d3 Mon Sep 17 00:00:00 2001 From: 0xZensh Date: Fri, 14 Jun 2024 18:50:43 +0800 Subject: [PATCH 2/3] Fix test for Rust 1.56.0 --- tests/test_derive.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_derive.rs b/tests/test_derive.rs index b0d3bd8..b468ab1 100644 --- a/tests/test_derive.rs +++ b/tests/test_derive.rs @@ -170,7 +170,7 @@ fn test_default() { let bytes = [255u8; 4]; test.byte_array = bytes.into(); - test.bytes = bytes.as_slice().into(); + test.bytes = (&bytes[..]).into(); test.byte_buf = bytes.into(); assert_tokens( From f746da27ef5f3ce8a3e6b1ace6f1fdb805c72ad3 Mon Sep 17 00:00:00 2001 From: 0xZensh Date: Sat, 15 Jun 2024 08:13:18 +0800 Subject: [PATCH 3/3] change from `impl From for ByteBuf` to `impl From> for ByteBuf` --- src/bytebuf.rs | 11 +++-------- tests/test_derive.rs | 4 ++-- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/bytebuf.rs b/src/bytebuf.rs index 60fc21d..135727b 100644 --- a/src/bytebuf.rs +++ b/src/bytebuf.rs @@ -131,14 +131,9 @@ impl BorrowMut for ByteBuf { } } -impl From for ByteBuf -where - T: Into>, -{ - fn from(bytes: T) -> Self { - ByteBuf { - bytes: bytes.into(), - } +impl From> for ByteBuf { + fn from(bytes: Vec) -> Self { + ByteBuf { bytes: bytes } } } diff --git a/tests/test_derive.rs b/tests/test_derive.rs index b468ab1..5f00ee2 100644 --- a/tests/test_derive.rs +++ b/tests/test_derive.rs @@ -148,7 +148,7 @@ struct TestFrom<'a> { } #[test] -fn test_default() { +fn test_from() { let mut test = TestFrom::default(); assert_tokens( @@ -171,7 +171,7 @@ fn test_default() { let bytes = [255u8; 4]; test.byte_array = bytes.into(); test.bytes = (&bytes[..]).into(); - test.byte_buf = bytes.into(); + test.byte_buf = bytes.to_vec().into(); assert_tokens( &test,