diff --git a/crates/musli-descriptive/src/lib.rs b/crates/musli-descriptive/src/lib.rs index 83154e33b..24f6fcce1 100644 --- a/crates/musli-descriptive/src/lib.rs +++ b/crates/musli-descriptive/src/lib.rs @@ -137,6 +137,6 @@ pub use self::error::Error; #[cfg(feature = "test")] #[cfg_attr(doc_cfg, doc(cfg(feature = "test")))] #[doc(hidden)] -pub use self::test::{transcode, Typed}; +pub use self::test::transcode; musli_utils::simdutf8!(); diff --git a/crates/musli-descriptive/src/test.rs b/crates/musli-descriptive/src/test.rs index 3cd3ef820..ef424b8e4 100644 --- a/crates/musli-descriptive/src/test.rs +++ b/crates/musli-descriptive/src/test.rs @@ -2,44 +2,8 @@ use core::fmt::Debug; -use musli::de::PackDecoder; use musli::mode::DefaultMode; -use musli::{Decode, Decoder, Encode}; - -use crate::tag::Tag; - -/// A typed field, which is prefixed with a type tag. -/// -/// This is used in combination with the storage deserializer to "inspect" type -/// tags. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct Typed { - tag: Tag, - value: T, -} - -impl Typed { - /// Construct a new typed field. - pub const fn new(tag: Tag, value: T) -> Self { - Self { tag, value } - } -} - -impl<'de, M, T> Decode<'de, M> for Typed -where - T: Decode<'de, M>, -{ - fn decode(_: &D::Cx, decoder: D) -> Result - where - D: Decoder<'de, Mode = M>, - { - decoder.decode_pack(|pack| { - let tag = pack.decode_next()?.decode()?; - let value = pack.decode_next()?.decode()?; - Ok(Self { tag, value }) - }) - } -} +use musli::{Decode, Encode}; musli_utils::test_fns!("descriptive", #[musli_value]); diff --git a/crates/musli-wire/src/tag.rs b/crates/musli-wire/src/tag.rs index 7a5c6a7ef..78815a970 100644 --- a/crates/musli-wire/src/tag.rs +++ b/crates/musli-wire/src/tag.rs @@ -5,7 +5,8 @@ use core::fmt; use core::mem; -use musli::{Decode, Decoder}; +#[cfg(feature = "test")] +use musli::{Decode, Encode}; /// Data masked into the data type. pub(crate) const DATA_MASK: u8 = 0b00_111111; @@ -40,7 +41,9 @@ pub enum Kind { /// question. It is primarily used to smuggle extra data for the kind in /// question. #[derive(Clone, Copy, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "test", derive(Encode, Decode))] #[repr(transparent)] +#[cfg_attr(feature = "test", musli(transparent))] pub struct Tag { /// The internal representation of the tag. repr: u8, @@ -141,13 +144,3 @@ impl fmt::Debug for Tag { .finish() } } - -impl<'de, M> Decode<'de, M> for Tag { - #[inline] - fn decode(_: &D::Cx, decoder: D) -> Result - where - D: Decoder<'de, Mode = M>, - { - Ok(Self::from_byte(decoder.decode()?)) - } -} diff --git a/crates/musli-wire/src/test.rs b/crates/musli-wire/src/test.rs index a10973efe..9851a62b2 100644 --- a/crates/musli-wire/src/test.rs +++ b/crates/musli-wire/src/test.rs @@ -2,9 +2,8 @@ use core::fmt::Debug; -use musli::de::PackDecoder; use musli::mode::DefaultMode; -use musli::{Decode, Decoder, Encode}; +use musli::{Decode, Encode}; use crate::tag::Tag; @@ -12,35 +11,21 @@ use crate::tag::Tag; /// /// This is used in combination with the storage deserializer to "inspect" type /// tags. -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -pub struct Typed { +#[derive(Debug, Clone, Copy, PartialEq, Eq, Encode, Decode)] +#[musli(packed)] +pub struct Typed { tag: Tag, - value: T, + #[musli(bytes)] + value: [u8; N], } -impl Typed { +impl Typed { /// Construct a new typed field. - pub const fn new(tag: Tag, value: T) -> Self { + pub const fn new(tag: Tag, value: [u8; N]) -> Self { Self { tag, value } } } -impl<'de, M, T> Decode<'de, M> for Typed -where - T: Decode<'de, M>, -{ - fn decode(_: &D::Cx, decoder: D) -> Result - where - D: Decoder<'de, Mode = M>, - { - decoder.decode_pack(|pack| { - let tag = pack.decode_next()?.decode()?; - let value = pack.decode_next()?.decode()?; - Ok(Self { tag, value }) - }) - } -} - musli_utils::test_fns!("wire"); /// Encode a type as one and decode as another. diff --git a/tests/tests/numbers.rs b/tests/tests/numbers.rs index 6b8a83d57..c44604d01 100644 --- a/tests/tests/numbers.rs +++ b/tests/tests/numbers.rs @@ -21,7 +21,7 @@ struct Unpacked { b: (Tag, Tag), c: (Tag, Tag), d: (Tag, Tag), - e: (Tag, Typed<[u8; 5]>), + e: (Tag, Typed<5>), } #[test] diff --git a/tests/tests/struct_name.rs b/tests/tests/struct_name.rs index 48643580b..601d6883e 100644 --- a/tests/tests/struct_name.rs +++ b/tests/tests/struct_name.rs @@ -52,9 +52,9 @@ fn named_struct_unpack() { #[musli(packed)] pub struct Unpacked { field_count: Tag, - field1_name: Typed<[u8; 6]>, - field1_value: Typed<[u8; 3]>, - field2_name: Typed<[u8; 6]>, + field1_name: Typed<6>, + field1_value: Typed<3>, + field2_name: Typed<6>, field2_value: Tag, } @@ -122,7 +122,7 @@ fn indexed_struct_unpack() { pub struct Unpacked { field_count: Tag, field1_index: Tag, - field1_value: Typed<[u8; 3]>, + field1_value: Typed<3>, field2_index: Tag, field2_value: Tag, }