Skip to content

Commit 4a2b32f

Browse files
committed
use convert from
1 parent c1ef658 commit 4a2b32f

File tree

3 files changed

+63
-65
lines changed

3 files changed

+63
-65
lines changed

src/derive/datetime.rs

+36-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use bytemuck::CheckedBitPattern;
22

3-
use super::Decode;
3+
use super::{
4+
convert::{ConvertFrom, ConvertIntoEncoder},
5+
Decode, Encode,
6+
};
47

58
/// A u8 guaranteed to be < 24.
69
#[derive(Copy, Clone)]
@@ -14,6 +17,14 @@ unsafe impl CheckedBitPattern for Hour {
1417
*bits < 24
1518
}
1619
}
20+
impl ConvertFrom<&Hour> for u8 {
21+
fn convert_from(value: &Hour) -> Self {
22+
value.0
23+
}
24+
}
25+
impl Encode for Hour {
26+
type Encoder = ConvertIntoEncoder<u8>;
27+
}
1728
impl<'a> Decode<'a> for Hour {
1829
type Decoder = crate::int::CheckedIntDecoder<'a, Hour, u8>;
1930
}
@@ -30,6 +41,14 @@ unsafe impl CheckedBitPattern for Minute {
3041
*bits < 60
3142
}
3243
}
44+
impl ConvertFrom<&Minute> for u8 {
45+
fn convert_from(value: &Minute) -> Self {
46+
value.0
47+
}
48+
}
49+
impl Encode for Minute {
50+
type Encoder = ConvertIntoEncoder<u8>;
51+
}
3352
impl<'a> Decode<'a> for Minute {
3453
type Decoder = crate::int::CheckedIntDecoder<'a, Minute, u8>;
3554
}
@@ -46,6 +65,14 @@ unsafe impl CheckedBitPattern for Second {
4665
*bits < 60
4766
}
4867
}
68+
impl ConvertFrom<&Second> for u8 {
69+
fn convert_from(value: &Second) -> Self {
70+
value.0
71+
}
72+
}
73+
impl Encode for Second {
74+
type Encoder = ConvertIntoEncoder<u8>;
75+
}
4976
impl<'a> Decode<'a> for Second {
5077
type Decoder = crate::int::CheckedIntDecoder<'a, Second, u8>;
5178
}
@@ -62,6 +89,14 @@ unsafe impl CheckedBitPattern for Nanoseconds {
6289
*bits < 1_000_000_000
6390
}
6491
}
92+
impl ConvertFrom<&Nanoseconds> for u32 {
93+
fn convert_from(value: &Nanoseconds) -> Self {
94+
value.0
95+
}
96+
}
97+
impl Encode for Nanoseconds {
98+
type Encoder = ConvertIntoEncoder<u32>;
99+
}
65100
impl<'a> Decode<'a> for Nanoseconds {
66101
type Decoder = crate::int::CheckedIntDecoder<'a, Nanoseconds, u32>;
67102
}

src/derive/impls.rs

+10
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,16 @@ impl<'a, T> Decode<'a> for PhantomData<T> {
213213
type Decoder = EmptyCoder;
214214
}
215215

216+
#[cfg(feature = "time")]
217+
mod with_time {
218+
use crate::convert::impl_convert;
219+
use crate::datetime::{Hour, Minute, Nanoseconds, Second};
220+
use crate::derive::{Decode, Encode};
221+
use time::Time;
222+
223+
impl_convert!(Time, (Hour, Minute, Second, Nanoseconds));
224+
}
225+
216226
macro_rules! impl_tuples {
217227
($(($($n:tt $name:ident)*))+) => {
218228
$(

src/ext/time_crate/time.rs

+17-64
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,35 @@
1-
use crate::coder::{Buffer, Decoder, Encoder, Result, View};
1+
use crate::convert::ConvertFrom;
22
use crate::datetime::{Hour, Minute, Nanoseconds, Second};
3-
use crate::{Decode, Encode};
4-
use alloc::vec::Vec;
5-
use core::num::NonZeroUsize;
63
use time::Time;
74

8-
#[derive(Default)]
9-
pub struct TimeEncoder {
10-
hour: <u8 as Encode>::Encoder,
11-
minute: <u8 as Encode>::Encoder,
12-
second: <u8 as Encode>::Encoder,
13-
nanosecond: <u32 as Encode>::Encoder,
14-
}
15-
impl Encoder<Time> for TimeEncoder {
16-
#[inline(always)]
17-
fn encode(&mut self, t: &Time) {
18-
let (hour, minute, second, nanosecond) = t.as_hms_nano();
19-
self.hour.encode(&hour);
20-
self.minute.encode(&minute);
21-
self.second.encode(&second);
22-
self.nanosecond.encode(&nanosecond);
23-
}
24-
}
25-
impl Buffer for TimeEncoder {
26-
fn collect_into(&mut self, out: &mut Vec<u8>) {
27-
self.hour.collect_into(out);
28-
self.minute.collect_into(out);
29-
self.second.collect_into(out);
30-
self.nanosecond.collect_into(out);
31-
}
32-
33-
fn reserve(&mut self, additional: NonZeroUsize) {
34-
self.hour.reserve(additional);
35-
self.minute.reserve(additional);
36-
self.second.reserve(additional);
37-
self.nanosecond.reserve(additional);
5+
impl ConvertFrom<&Time> for (Hour, Minute, Second, Nanoseconds) {
6+
fn convert_from(value: &Time) -> Self {
7+
let (hour, minute, second, nanosecond) = value.as_hms_nano();
8+
(
9+
Hour(hour),
10+
Minute(minute),
11+
Second(second),
12+
Nanoseconds(nanosecond),
13+
)
3814
}
3915
}
40-
impl Encode for Time {
41-
type Encoder = TimeEncoder;
42-
}
4316

44-
#[derive(Default)]
45-
pub struct TimeDecoder<'a> {
46-
hour: <Hour as Decode<'a>>::Decoder,
47-
minute: <Minute as Decode<'a>>::Decoder,
48-
second: <Second as Decode<'a>>::Decoder,
49-
nanosecond: <Nanoseconds as Decode<'a>>::Decoder,
50-
}
51-
impl<'a> View<'a> for TimeDecoder<'a> {
52-
fn populate(&mut self, input: &mut &'a [u8], length: usize) -> Result<()> {
53-
self.hour.populate(input, length)?;
54-
self.minute.populate(input, length)?;
55-
self.second.populate(input, length)?;
56-
self.nanosecond.populate(input, length)?;
57-
Ok(())
58-
}
59-
}
60-
impl<'a> Decoder<'a, Time> for TimeDecoder<'a> {
61-
#[inline(always)]
62-
fn decode(&mut self) -> Time {
63-
let Hour(hour) = self.hour.decode();
64-
let Minute(minute) = self.minute.decode();
65-
let Second(second) = self.second.decode();
66-
let Nanoseconds(nanosecond) = self.nanosecond.decode();
17+
impl ConvertFrom<(Hour, Minute, Second, Nanoseconds)> for Time {
18+
fn convert_from(value: (Hour, Minute, Second, Nanoseconds)) -> Self {
19+
let (Hour(hour), Minute(minute), Second(second), Nanoseconds(nanosecond)) = value;
6720
// Safety: should not fail because all input values are validated with CheckedBitPattern.
6821
unsafe { Time::from_hms_nano(hour, minute, second, nanosecond).unwrap_unchecked() }
6922
}
7023
}
71-
impl<'a> Decode<'a> for Time {
72-
type Decoder = TimeDecoder<'a>;
73-
}
7424

7525
#[cfg(test)]
7626
mod tests {
7727
#[test]
7828
fn test() {
79-
assert!(crate::decode::<Time>(&crate::encode(&(23, 59, 59, 999_999_999))).is_ok());
29+
assert!(crate::decode::<Time>(&crate::encode(
30+
&Time::from_hms_nano(23, 59, 59, 999_999_999).unwrap()
31+
))
32+
.is_ok());
8033
assert!(crate::decode::<Time>(&crate::encode(&(24, 59, 59, 999_999_999))).is_err());
8134
assert!(crate::decode::<Time>(&crate::encode(&(23, 60, 59, 999_999_999))).is_err());
8235
assert!(crate::decode::<Time>(&crate::encode(&(23, 59, 60, 999_999_999))).is_err());

0 commit comments

Comments
 (0)