1use messagepack_core::{
2 Format,
3 extension::ExtensionRef as CoreExtensionRef,
4 io::{IoRead, IoWrite},
5};
6use serde::{
7 Serialize, Serializer,
8 de::Visitor,
9 ser::{self, SerializeSeq},
10};
11
12use crate::ser::Error;
13
14pub(crate) const EXTENSION_STRUCT_NAME: &str = "$__MSGPACK_EXTENSION_STRUCT";
15
16pub(crate) struct SerializeExt<'a, W> {
17 writer: &'a mut W,
18 length: usize,
19}
20
21impl<W> AsMut<Self> for SerializeExt<'_, W> {
22 fn as_mut(&mut self) -> &mut Self {
23 self
24 }
25}
26
27impl<'a, W> SerializeExt<'a, W> {
28 pub fn new(writer: &'a mut W) -> Self {
29 Self { writer, length: 0 }
30 }
31
32 pub(crate) fn length(&self) -> usize {
33 self.length
34 }
35}
36
37impl<W: IoWrite> SerializeExt<'_, W> {
38 fn unexpected(&self) -> Error<W::Error> {
39 ser::Error::custom("unexpected value")
40 }
41}
42
43impl<'a, 'b, W> ser::Serializer for &'a mut SerializeExt<'b, W>
44where
45 'b: 'a,
46 W: IoWrite,
47{
48 type Ok = ();
49
50 type Error = Error<W::Error>;
51
52 type SerializeSeq = SerializeExtSeq<'a, 'b, W>;
53
54 type SerializeTuple = serde::ser::Impossible<Self::Ok, Self::Error>;
55
56 type SerializeTupleStruct = serde::ser::Impossible<Self::Ok, Self::Error>;
57
58 type SerializeTupleVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
59
60 type SerializeMap = serde::ser::Impossible<Self::Ok, Self::Error>;
61
62 type SerializeStruct = serde::ser::Impossible<Self::Ok, Self::Error>;
63
64 type SerializeStructVariant = serde::ser::Impossible<Self::Ok, Self::Error>;
65
66 fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
67 Err(self.unexpected())
68 }
69
70 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
71 self.serialize_bytes(&v.to_be_bytes())
72 }
73
74 fn serialize_i16(self, _v: i16) -> Result<Self::Ok, Self::Error> {
75 Err(self.unexpected())
76 }
77
78 fn serialize_i32(self, _v: i32) -> Result<Self::Ok, Self::Error> {
79 Err(self.unexpected())
80 }
81
82 fn serialize_i64(self, _v: i64) -> Result<Self::Ok, Self::Error> {
83 Err(self.unexpected())
84 }
85
86 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
87 self.serialize_bytes(&v.to_be_bytes())
88 }
89
90 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
91 self.serialize_bytes(&v.to_be_bytes())
92 }
93
94 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
95 self.serialize_bytes(&v.to_be_bytes())
96 }
97
98 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
99 self.serialize_bytes(&v.to_be_bytes())
100 }
101
102 fn serialize_f32(self, _v: f32) -> Result<Self::Ok, Self::Error> {
103 Err(self.unexpected())
104 }
105
106 fn serialize_f64(self, _v: f64) -> Result<Self::Ok, Self::Error> {
107 Err(self.unexpected())
108 }
109
110 fn serialize_char(self, _v: char) -> Result<Self::Ok, Self::Error> {
111 Err(self.unexpected())
112 }
113
114 fn serialize_str(self, _v: &str) -> Result<Self::Ok, Self::Error> {
115 Err(self.unexpected())
116 }
117
118 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
119 self.writer
120 .write(v)
121 .map_err(messagepack_core::encode::Error::Io)?;
122 self.length += v.len();
123 Ok(())
124 }
125
126 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
127 Err(self.unexpected())
128 }
129
130 fn serialize_some<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
131 where
132 T: ?Sized + Serialize,
133 {
134 Err(self.unexpected())
135 }
136
137 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
138 Err(self.unexpected())
139 }
140
141 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
142 Err(self.unexpected())
143 }
144
145 fn serialize_unit_variant(
146 self,
147 _name: &'static str,
148 _variant_index: u32,
149 _variant: &'static str,
150 ) -> Result<Self::Ok, Self::Error> {
151 Err(self.unexpected())
152 }
153
154 fn serialize_newtype_struct<T>(
155 self,
156 _name: &'static str,
157 value: &T,
158 ) -> Result<Self::Ok, Self::Error>
159 where
160 T: ?Sized + Serialize,
161 {
162 value.serialize(self)
163 }
164
165 fn serialize_newtype_variant<T>(
166 self,
167 _name: &'static str,
168 _variant_index: u32,
169 _variant: &'static str,
170 _value: &T,
171 ) -> Result<Self::Ok, Self::Error>
172 where
173 T: ?Sized + Serialize,
174 {
175 Err(self.unexpected())
176 }
177
178 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
179 Ok(SerializeExtSeq::new(self))
180 }
181
182 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> {
183 Err(self.unexpected())
184 }
185
186 fn serialize_tuple_struct(
187 self,
188 _name: &'static str,
189 _len: usize,
190 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
191 Err(self.unexpected())
192 }
193
194 fn serialize_tuple_variant(
195 self,
196 _name: &'static str,
197 _variant_index: u32,
198 _variant: &'static str,
199 _len: usize,
200 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
201 Err(self.unexpected())
202 }
203
204 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
205 Err(self.unexpected())
206 }
207
208 fn serialize_struct(
209 self,
210 _name: &'static str,
211 _len: usize,
212 ) -> Result<Self::SerializeStruct, Self::Error> {
213 Err(self.unexpected())
214 }
215
216 fn serialize_struct_variant(
217 self,
218 _name: &'static str,
219 _variant_index: u32,
220 _variant: &'static str,
221 _len: usize,
222 ) -> Result<Self::SerializeStructVariant, Self::Error> {
223 Err(self.unexpected())
224 }
225
226 fn collect_str<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
227 where
228 T: ?Sized + core::fmt::Display,
229 {
230 Err(self.unexpected())
231 }
232}
233
234pub struct SerializeExtSeq<'a, 'b, W> {
235 ser: &'a mut SerializeExt<'b, W>,
236}
237
238impl<'a, 'b, W> SerializeExtSeq<'a, 'b, W> {
239 pub(crate) fn new(ser: &'a mut SerializeExt<'b, W>) -> Self {
240 Self { ser }
241 }
242}
243
244impl<'a, 'b, W> ser::SerializeSeq for SerializeExtSeq<'a, 'b, W>
245where
246 'b: 'a,
247 W: IoWrite,
248{
249 type Ok = ();
250 type Error = Error<W::Error>;
251 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
252 where
253 T: ?Sized + Serialize,
254 {
255 value.serialize(self.ser.as_mut())
256 }
257 fn end(self) -> Result<Self::Ok, Self::Error> {
258 Ok(())
259 }
260}
261
262struct Bytes<'a>(pub &'a [u8]);
263impl ser::Serialize for Bytes<'_> {
264 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
265 where
266 S: Serializer,
267 {
268 serializer.serialize_bytes(self.0)
269 }
270}
271
272struct ExtInner<'a> {
273 kind: i8,
274 data: &'a [u8],
275}
276
277impl ser::Serialize for ExtInner<'_> {
278 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
279 where
280 S: Serializer,
281 {
282 let encoder = CoreExtensionRef::new(self.kind, self.data);
283 let format = encoder
284 .to_format::<core::convert::Infallible>()
285 .map_err(|_| ser::Error::custom("Invalid data length"))?;
286
287 let mut seq = serializer.serialize_seq(Some(4))?;
288
289 seq.serialize_element(&Bytes(&format.as_slice()))?;
290
291 match format {
292 messagepack_core::Format::FixExt1
293 | messagepack_core::Format::FixExt2
294 | messagepack_core::Format::FixExt4
295 | messagepack_core::Format::FixExt8
296 | messagepack_core::Format::FixExt16 => {}
297
298 messagepack_core::Format::Ext8 => {
299 let len = (self.data.len() as u8).to_be_bytes();
300 seq.serialize_element(&Bytes(&len))?;
301 }
302 messagepack_core::Format::Ext16 => {
303 let len = (self.data.len() as u16).to_be_bytes();
304 seq.serialize_element(&Bytes(&len))?;
305 }
306 messagepack_core::Format::Ext32 => {
307 let len = (self.data.len() as u32).to_be_bytes();
308 seq.serialize_element(&Bytes(&len))?;
309 }
310 _ => return Err(ser::Error::custom("unexpected format")),
311 };
312 seq.serialize_element(&Bytes(&self.kind.to_be_bytes()))?;
313 seq.serialize_element(&Bytes(self.data))?;
314
315 seq.end()
316 }
317}
318
319pub(crate) struct DeserializeExt<'a, R> {
320 data_len: usize,
321 reader: &'a mut R,
322}
323
324impl<'a, R> AsMut<Self> for DeserializeExt<'a, R> {
325 fn as_mut(&mut self) -> &mut Self {
326 self
327 }
328}
329
330impl<'de, 'a, R> DeserializeExt<'a, R>
331where
332 R: IoRead<'de>,
333{
334 pub(crate) fn new(
335 format: Format,
336 reader: &'a mut R,
337 ) -> Result<Self, crate::de::Error<R::Error>> {
338 use messagepack_core::decode::NbyteReader;
339 let data_len = match format {
340 Format::FixExt1 => 1,
341 Format::FixExt2 => 2,
342 Format::FixExt4 => 4,
343 Format::FixExt8 => 8,
344 Format::FixExt16 => 16,
345 Format::Ext8 => NbyteReader::<1>::read(reader)?,
346 Format::Ext16 => NbyteReader::<2>::read(reader)?,
347 Format::Ext32 => NbyteReader::<4>::read(reader)?,
348 _ => return Err(messagepack_core::decode::Error::UnexpectedFormat.into()),
349 };
350 Ok(DeserializeExt { data_len, reader })
351 }
352}
353
354impl<'de, 'a, R> serde::Deserializer<'de> for &mut DeserializeExt<'a, R>
355where
356 R: IoRead<'de>,
357{
358 type Error = crate::de::Error<R::Error>;
359
360 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
361 where
362 V: Visitor<'de>,
363 {
364 Err(serde::de::Error::custom(
365 "any when deserialize extension is not supported",
366 ))
367 }
368
369 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
370 where
371 V: Visitor<'de>,
372 {
373 let slice = self
374 .reader
375 .read_slice(1)
376 .map_err(messagepack_core::decode::Error::Io)?;
377 let buf: [u8; 1] = slice
378 .as_bytes()
379 .try_into()
380 .map_err(|_| messagepack_core::decode::Error::UnexpectedEof)?;
381
382 let val = i8::from_be_bytes(buf);
383 visitor.visit_i8(val)
384 }
385
386 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
387 where
388 V: Visitor<'de>,
389 {
390 let slice = self
391 .reader
392 .read_slice(self.data_len)
393 .map_err(messagepack_core::decode::Error::Io)?;
394 match slice {
395 messagepack_core::io::Reference::Borrowed(items) => visitor.visit_borrowed_bytes(items),
396 messagepack_core::io::Reference::Copied(items) => visitor.visit_bytes(items),
397 }
398 }
399
400 fn deserialize_seq<V>(mut self, visitor: V) -> Result<V::Value, Self::Error>
401 where
402 V: Visitor<'de>,
403 {
404 visitor.visit_seq(&mut self)
405 }
406
407 fn deserialize_newtype_struct<V>(
408 self,
409 _name: &'static str,
410 visitor: V,
411 ) -> Result<V::Value, Self::Error>
412 where
413 V: Visitor<'de>,
414 {
415 visitor.visit_newtype_struct(self)
416 }
417
418 serde::forward_to_deserialize_any! {
419 bool i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
420 byte_buf option unit unit_struct tuple
421 tuple_struct map struct enum identifier ignored_any
422 }
423}
424
425impl<'de, 'a, R> serde::de::SeqAccess<'de> for &mut DeserializeExt<'a, R>
426where
427 R: IoRead<'de>,
428{
429 type Error = crate::de::Error<R::Error>;
430 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
431 where
432 T: serde::de::DeserializeSeed<'de>,
433 {
434 seed.deserialize(self.as_mut()).map(Some)
435 }
436}
437
438pub mod ext_ref {
466 use super::*;
467 use serde::de;
468
469 pub fn serialize<S>(
471 ext: &messagepack_core::extension::ExtensionRef<'_>,
472 serializer: S,
473 ) -> Result<S::Ok, S::Error>
474 where
475 S: serde::Serializer,
476 {
477 serializer.serialize_newtype_struct(
478 EXTENSION_STRUCT_NAME,
479 &ExtInner {
480 kind: ext.r#type,
481 data: ext.data,
482 },
483 )
484 }
485
486 pub fn deserialize<'de, D>(
488 deserializer: D,
489 ) -> Result<messagepack_core::extension::ExtensionRef<'de>, D::Error>
490 where
491 D: serde::Deserializer<'de>,
492 {
493 struct ExtensionVisitor;
494
495 impl<'de> Visitor<'de> for ExtensionVisitor {
496 type Value = messagepack_core::extension::ExtensionRef<'de>;
497 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
498 formatter.write_str("expect extension")
499 }
500
501 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
502 where
503 D: de::Deserializer<'de>,
504 {
505 deserializer.deserialize_seq(self)
506 }
507
508 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
509 where
510 A: serde::de::SeqAccess<'de>,
511 {
512 let kind = seq
513 .next_element::<i8>()?
514 .ok_or(de::Error::missing_field("extension type missing"))?;
515
516 let data = seq
517 .next_element::<&[u8]>()?
518 .ok_or(de::Error::missing_field("extension data missing"))?;
519
520 Ok(messagepack_core::extension::ExtensionRef::new(kind, data))
521 }
522 }
523 deserializer.deserialize_seq(ExtensionVisitor)
524 }
525}
526
527pub mod ext_fixed {
555 use super::*;
556 use serde::{Deserialize, de};
557
558 pub fn serialize<const N: usize, S>(
560 ext: &messagepack_core::extension::FixedExtension<N>,
561 serializer: S,
562 ) -> Result<S::Ok, S::Error>
563 where
564 S: serde::Serializer,
565 {
566 super::ext_ref::serialize(&ext.as_ref(), serializer)
567 }
568
569 pub fn deserialize<'de, const N: usize, D>(
571 deserializer: D,
572 ) -> Result<messagepack_core::extension::FixedExtension<N>, D::Error>
573 where
574 D: serde::Deserializer<'de>,
575 {
576 struct Data<const N: usize> {
577 len: usize,
578 buf: [u8; N],
579 }
580 impl<'de, const N: usize> Deserialize<'de> for Data<N> {
581 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
582 where
583 D: de::Deserializer<'de>,
584 {
585 struct DataVisitor<const N: usize>;
586 impl<'de, const N: usize> Visitor<'de> for DataVisitor<N> {
587 type Value = Data<N>;
588 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
589 formatter.write_str("expect extension")
590 }
591
592 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
593 where
594 E: de::Error,
595 {
596 let len = v.len();
597
598 if len > N {
599 return Err(de::Error::invalid_length(len, &self));
600 }
601
602 let mut buf = [0; N];
603 buf[..len].copy_from_slice(v);
604 Ok(Data { len, buf })
605 }
606 }
607 deserializer.deserialize_bytes(DataVisitor)
608 }
609 }
610
611 struct ExtensionVisitor<const N: usize>;
612 impl<'de, const N: usize> Visitor<'de> for ExtensionVisitor<N> {
613 type Value = messagepack_core::extension::FixedExtension<N>;
614 fn expecting(&self, formatter: &mut core::fmt::Formatter) -> core::fmt::Result {
615 formatter.write_str("expect extension")
616 }
617
618 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
619 where
620 D: de::Deserializer<'de>,
621 {
622 deserializer.deserialize_seq(self)
623 }
624
625 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
626 where
627 A: de::SeqAccess<'de>,
628 {
629 let kind = seq
630 .next_element::<i8>()?
631 .ok_or(serde::de::Error::missing_field("extension type missing"))?;
632 let data = seq
633 .next_element::<Data<N>>()?
634 .ok_or(de::Error::missing_field("extension data missing"))?;
635
636 let ext = messagepack_core::extension::FixedExtension::new_fixed(
637 kind, data.len, data.buf,
638 );
639 Ok(ext)
640 }
641 }
642
643 deserializer.deserialize_seq(ExtensionVisitor)
644 }
645}
646
647pub mod timestamp32 {
673 pub fn serialize<S>(
675 ts: &messagepack_core::timestamp::Timestamp32,
676 serializer: S,
677 ) -> Result<S::Ok, S::Error>
678 where
679 S: serde::Serializer,
680 {
681 let ext: messagepack_core::extension::FixedExtension<4> = (*ts).into();
682 super::ext_fixed::serialize::<4, _>(&ext, serializer)
683 }
684
685 pub fn deserialize<'de, D>(
687 deserializer: D,
688 ) -> Result<messagepack_core::timestamp::Timestamp32, D::Error>
689 where
690 D: serde::Deserializer<'de>,
691 {
692 let ext = super::ext_fixed::deserialize::<4, _>(deserializer)?;
693 ext.try_into()
694 .map_err(|_| serde::de::Error::custom("invalid timestamp32"))
695 }
696}
697
698pub mod timestamp64 {
724 pub fn serialize<S>(
726 ts: &messagepack_core::timestamp::Timestamp64,
727 serializer: S,
728 ) -> Result<S::Ok, S::Error>
729 where
730 S: serde::Serializer,
731 {
732 let ext: messagepack_core::extension::FixedExtension<8> = (*ts).into();
733 super::ext_fixed::serialize::<8, _>(&ext, serializer)
734 }
735
736 pub fn deserialize<'de, D>(
738 deserializer: D,
739 ) -> Result<messagepack_core::timestamp::Timestamp64, D::Error>
740 where
741 D: serde::Deserializer<'de>,
742 {
743 let ext = super::ext_fixed::deserialize::<8, _>(deserializer)?;
744 ext.try_into()
745 .map_err(|_| serde::de::Error::custom("invalid timestamp64"))
746 }
747}
748
749pub mod timestamp96 {
775 pub fn serialize<S>(
777 ts: &messagepack_core::timestamp::Timestamp96,
778 serializer: S,
779 ) -> Result<S::Ok, S::Error>
780 where
781 S: serde::Serializer,
782 {
783 let ext: messagepack_core::extension::FixedExtension<12> = (*ts).into();
784 super::ext_fixed::serialize::<12, _>(&ext, serializer)
785 }
786
787 pub fn deserialize<'de, D>(
789 deserializer: D,
790 ) -> Result<messagepack_core::timestamp::Timestamp96, D::Error>
791 where
792 D: serde::Deserializer<'de>,
793 {
794 let ext = super::ext_fixed::deserialize::<12, _>(deserializer)?;
795 ext.try_into()
796 .map_err(|_| serde::de::Error::custom("invalid timestamp96"))
797 }
798}
799
800#[cfg(test)]
801mod tests {
802 use super::*;
803
804 use messagepack_core::extension::{ExtensionRef, FixedExtension};
805 use messagepack_core::timestamp::{Timestamp32, Timestamp64, Timestamp96};
806 use rstest::rstest;
807 use serde::{Deserialize, Serialize};
808
809 #[derive(Debug, Serialize, Deserialize)]
810 struct WrapRef<'a>(
811 #[serde(with = "ext_ref", borrow)] messagepack_core::extension::ExtensionRef<'a>,
812 );
813
814 #[rstest]
815 fn encode_ext_ref() {
816 let mut buf = [0_u8; 3];
817
818 let kind: i8 = 123;
819
820 let ext = WrapRef(ExtensionRef::new(kind, &[0x12]));
821 let length = crate::to_slice(&ext, &mut buf).unwrap();
822
823 assert_eq!(length, 3);
824 assert_eq!(buf, [0xd4, kind.to_be_bytes()[0], 0x12]);
825 }
826
827 #[rstest]
828 fn decode_ext_ref() {
829 let buf = [0xd6, 0xff, 0x00, 0x00, 0x00, 0x00]; let ext = crate::from_slice::<WrapRef<'_>>(&buf).unwrap().0;
832 assert_eq!(ext.r#type, -1);
833 let seconds = u32::from_be_bytes(ext.data.try_into().unwrap());
834 assert_eq!(seconds, 0);
835 }
836
837 #[derive(Debug, Serialize, Deserialize)]
838 struct WrapFixed<const N: usize>(
839 #[serde(with = "ext_fixed")] messagepack_core::extension::FixedExtension<N>,
840 );
841
842 #[rstest]
843 fn encode_ext_fixed() {
844 let mut buf = [0u8; 3];
845 let kind: i8 = 123;
846
847 let ext = WrapFixed(FixedExtension::new_fixed(kind, 1, [0x12]));
848 let length = crate::to_slice(&ext, &mut buf).unwrap();
849
850 assert_eq!(length, 3);
851 assert_eq!(buf, [0xd4, kind.to_be_bytes()[0], 0x12]);
852 }
853
854 const TIMESTAMP32: &[u8] = &[0xd6, 0xff, 0x00, 0x00, 0x00, 0x00];
855
856 #[rstest]
857 fn decode_ext_fixed_bigger_will_success() {
858 let ext = crate::from_slice::<WrapFixed<6>>(TIMESTAMP32).unwrap().0;
859 assert_eq!(ext.r#type, -1);
860 assert_eq!(ext.as_slice(), &TIMESTAMP32[2..])
861 }
862
863 #[rstest]
864 #[should_panic]
865 fn decode_ext_fixed_smaller_will_failed() {
866 let _ = crate::from_slice::<WrapFixed<3>>(TIMESTAMP32).unwrap();
867 }
868
869 #[derive(Debug, Serialize, Deserialize, PartialEq)]
870 struct WrapTs32(#[serde(with = "timestamp32")] Timestamp32);
871
872 #[rstest]
873 fn encode_timestamp32() {
874 let ts = WrapTs32(Timestamp32::new(123456));
875 let mut buf = [0u8; 16];
876 let n = crate::to_slice(&ts, &mut buf).unwrap();
877
878 let mut expected = vec![0xd6, (-1i8 as u8)];
879 expected.extend_from_slice(&123456u32.to_be_bytes());
880 assert_eq!(&buf[..n], expected.as_slice());
881 }
882
883 #[rstest]
884 fn decode_timestamp32() {
885 let mut buf = vec![0xd6, (-1i8 as u8)];
886 buf.extend_from_slice(&0u32.to_be_bytes());
887 let v = crate::from_slice::<WrapTs32>(&buf).unwrap();
888 assert_eq!(v.0.seconds(), 0);
889 }
890
891 #[derive(Debug, Serialize, Deserialize, PartialEq)]
892 struct WrapTs64(#[serde(with = "timestamp64")] Timestamp64);
893
894 #[rstest]
895 fn encode_timestamp64() {
896 let ts = WrapTs64(Timestamp64::new(123456, 789).unwrap());
897 let mut buf = [0u8; 32];
898 let n = crate::to_slice(&ts, &mut buf).unwrap();
899
900 let mut expected = vec![0xd7, (-1i8 as u8)];
901 let data = ((789u64 << 34) | 123456).to_be_bytes();
902 expected.extend_from_slice(&data);
903 assert_eq!(&buf[..n], expected.as_slice());
904 }
905
906 #[rstest]
907 fn decode_timestamp64() {
908 let mut buf = vec![0xd7, (-1i8 as u8)];
909 let data = ((789u64 << 34) | 123456).to_be_bytes();
910 buf.extend_from_slice(&data);
911 let v = crate::from_slice::<WrapTs64>(&buf).unwrap();
912 assert_eq!(v.0.seconds(), 123456);
913 assert_eq!(v.0.nanos(), 789);
914 }
915
916 #[derive(Debug, Serialize, Deserialize, PartialEq)]
917 struct WrapTs96(#[serde(with = "timestamp96")] Timestamp96);
918
919 #[rstest]
920 fn encode_timestamp96() {
921 let ts = WrapTs96(Timestamp96::new(123456, 789));
922 let mut buf = [0u8; 32];
923 let n = crate::to_slice(&ts, &mut buf).unwrap();
924
925 let mut expected = vec![0xc7, 12, (-1i8 as u8)];
926 expected.extend_from_slice(&789u32.to_be_bytes());
927 expected.extend_from_slice(&123456u64.to_be_bytes());
928 assert_eq!(&buf[..n], expected.as_slice());
929 }
930
931 #[rstest]
932 fn decode_timestamp96() {
933 let mut buf = vec![0xc7, 12, (-1i8 as u8)];
934 buf.extend_from_slice(&789u32.to_be_bytes());
935 buf.extend_from_slice(&123456u64.to_be_bytes());
936 let v = crate::from_slice::<WrapTs96>(&buf).unwrap();
937 assert_eq!(v.0.seconds(), 123456);
938 assert_eq!(v.0.nanos(), 789);
939 }
940}