diff --git a/src/derive/datetime.rs b/src/derive/datetime.rs index 63d8c8e..5754cd4 100644 --- a/src/derive/datetime.rs +++ b/src/derive/datetime.rs @@ -1,6 +1,9 @@ use bytemuck::CheckedBitPattern; -use super::Decode; +use super::{ + convert::{ConvertFrom, ConvertIntoEncoder}, + Decode, Encode, +}; /// A u8 guaranteed to be < 24. #[derive(Copy, Clone)] @@ -14,6 +17,14 @@ unsafe impl CheckedBitPattern for Hour { *bits < 24 } } +impl ConvertFrom<&Hour> for u8 { + fn convert_from(value: &Hour) -> Self { + value.0 + } +} +impl Encode for Hour { + type Encoder = ConvertIntoEncoder; +} impl<'a> Decode<'a> for Hour { type Decoder = crate::int::CheckedIntDecoder<'a, Hour, u8>; } @@ -30,6 +41,14 @@ unsafe impl CheckedBitPattern for Minute { *bits < 60 } } +impl ConvertFrom<&Minute> for u8 { + fn convert_from(value: &Minute) -> Self { + value.0 + } +} +impl Encode for Minute { + type Encoder = ConvertIntoEncoder; +} impl<'a> Decode<'a> for Minute { type Decoder = crate::int::CheckedIntDecoder<'a, Minute, u8>; } @@ -46,6 +65,14 @@ unsafe impl CheckedBitPattern for Second { *bits < 60 } } +impl ConvertFrom<&Second> for u8 { + fn convert_from(value: &Second) -> Self { + value.0 + } +} +impl Encode for Second { + type Encoder = ConvertIntoEncoder; +} impl<'a> Decode<'a> for Second { type Decoder = crate::int::CheckedIntDecoder<'a, Second, u8>; } @@ -62,6 +89,14 @@ unsafe impl CheckedBitPattern for Nanoseconds { *bits < 1_000_000_000 } } +impl ConvertFrom<&Nanoseconds> for u32 { + fn convert_from(value: &Nanoseconds) -> Self { + value.0 + } +} +impl Encode for Nanoseconds { + type Encoder = ConvertIntoEncoder; +} impl<'a> Decode<'a> for Nanoseconds { type Decoder = crate::int::CheckedIntDecoder<'a, Nanoseconds, u32>; } diff --git a/src/derive/impls.rs b/src/derive/impls.rs index 4c98231..49031df 100644 --- a/src/derive/impls.rs +++ b/src/derive/impls.rs @@ -213,6 +213,16 @@ impl<'a, T> Decode<'a> for PhantomData { type Decoder = EmptyCoder; } +#[cfg(feature = "time")] +mod with_time { + use crate::convert::impl_convert; + use crate::datetime::{Hour, Minute, Nanoseconds, Second}; + use crate::derive::{Decode, Encode}; + use time::Time; + + impl_convert!(Time, (Hour, Minute, Second, Nanoseconds)); +} + macro_rules! impl_tuples { ($(($($n:tt $name:ident)*))+) => { $( diff --git a/src/ext/time_crate/time.rs b/src/ext/time_crate/time.rs index 7649c1d..356e069 100644 --- a/src/ext/time_crate/time.rs +++ b/src/ext/time_crate/time.rs @@ -1,82 +1,35 @@ -use crate::coder::{Buffer, Decoder, Encoder, Result, View}; +use crate::convert::ConvertFrom; use crate::datetime::{Hour, Minute, Nanoseconds, Second}; -use crate::{Decode, Encode}; -use alloc::vec::Vec; -use core::num::NonZeroUsize; use time::Time; -#[derive(Default)] -pub struct TimeEncoder { - hour: ::Encoder, - minute: ::Encoder, - second: ::Encoder, - nanosecond: ::Encoder, -} -impl Encoder