1use crate::WireType;
2use crate::varint::Varint;
3
4use std::fmt;
5use std::collections::HashMap;
6
7use bytes::{BytesOwned, BytesWrite, BytesRead};
8
9
10#[derive(Debug, Clone, PartialEq, Eq)]
11#[non_exhaustive]
12pub enum EncodeError {
13 BufferExausted,
14 Other(String)
15}
16
17impl fmt::Display for EncodeError {
18 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19 match self {
20 Self::BufferExausted => write!(f, "the buffer was to small"),
21 Self::Other(s) => write!(f, "encode error: {s}")
22 }
23 }
24}
25
26impl std::error::Error for EncodeError {}
27
28#[derive(Debug)]
29pub struct MessageEncoder<B> {
30 inner: B
31}
32
33impl<B> MessageEncoder<B> {
34 pub fn new(inner: B) -> Self {
35 Self {
36 inner
37 }
38 }
39
40 pub fn inner(&self) -> &B {
41 &self.inner
42 }
43
44 pub fn finish(self) -> B {
45 self.inner
46 }
47}
48
49impl MessageEncoder<BytesOwned> {
50 pub fn new_owned() -> Self {
51 Self {
52 inner: BytesOwned::new()
53 }
54 }
55}
56
57
58impl<B> MessageEncoder<B>
59where B: BytesWrite {
60 pub fn write_tag(
61 &mut self,
62 fieldnum: u64,
63 wtype: WireType
64 ) -> Result<(), EncodeError> {
65 let mut tag = Varint(fieldnum << 3);
66 tag.0 |= wtype.as_num() as u64;
67
68 tag.write(&mut self.inner).map_err(|_| EncodeError::BufferExausted)
69 }
70
71 pub fn write_len(&mut self, len: u64) -> Result<(), EncodeError> {
72 Varint(len).write(&mut self.inner)
73 .map_err(|_| EncodeError::BufferExausted)
74 }
75
76 pub fn write_bytes(&mut self, bytes: &[u8]) -> Result<(), EncodeError> {
77 self.inner.try_write(bytes).map_err(|_| EncodeError::BufferExausted)
78 }
79
80 pub fn written_len(&self) -> u64 {
81 self.inner.as_bytes().len() as u64
82 }
83
84 pub fn write_varint(&mut self, val: u64) -> Result<(), EncodeError> {
85 Varint(val).write(&mut self.inner)
86 .map_err(|_| EncodeError::BufferExausted)
87 }
88
89 pub fn write_i32(&mut self, val: u32) -> Result<(), EncodeError> {
90 self.inner.try_write_le_u32(val)
91 .map_err(|_| EncodeError::BufferExausted)
92 }
93
94 pub fn write_i64(&mut self, val: u64) -> Result<(), EncodeError> {
95 self.inner.try_write_le_u64(val)
96 .map_err(|_| EncodeError::BufferExausted)
97 }
98
99 pub fn write_empty_field(
100 &mut self,
101 fieldnum: u64
102 ) -> Result<(), EncodeError> {
103 self.write_tag(fieldnum, WireType::Len)?;
104 self.write_len(0)
105 }
106}
107
108impl From<MessageEncoder<BytesOwned>> for Vec<u8> {
109 fn from(w: MessageEncoder<BytesOwned>) -> Self {
110 w.inner.into()
111 }
112}
113
114#[derive(Debug)]
115pub struct SizeBuilder {
116 inner: u64
117}
118
119impl SizeBuilder {
120 pub fn new() -> Self {
121 Self {
122 inner: 0
123 }
124 }
125
126 pub fn write_tag(
127 &mut self,
128 fieldnum: u64,
129 _wtype: WireType
130 ) {
131 self.inner += Varint(fieldnum << 3).size();
132 }
133
134 pub fn write_len(&mut self, len: u64) {
135 self.write_varint(len);
137 }
138
139 pub fn write_varint(&mut self, val: u64) {
140 self.inner += Varint(val).size();
141 }
142
143 pub fn write_i32(&mut self, _val: u32) {
144 self.inner += 4;
145 }
146
147 pub fn write_i64(&mut self, _val: u64) {
148 self.inner += 8;
149 }
150
151 pub fn write_bytes(&mut self, len: u64) {
152 self.inner += len;
153 }
154
155 pub fn write_empty_field(&mut self, fieldnum: u64) {
156 self.write_tag(fieldnum, WireType::Len);
157 self.write_len(0);
158 }
159
160 pub fn finish(self) -> u64 {
161 self.inner
162 }
163}
164
165#[derive(Debug, Clone, Copy, PartialEq, Eq)]
166pub struct FieldOpt {
167 pub num: u64,
168 pub is_nested: bool
169}
170
171impl FieldOpt {
172 pub const fn new(num: u64) -> Self {
173 Self {
174 num,
175 is_nested: false
176 }
177 }
178}
179
180pub trait EncodeMessage {
186 fn write_to_bytes(&mut self) -> Result<Vec<u8>, EncodeError> {
187 let mut encoder = MessageEncoder::new_owned();
189
190 self.encode(None, &mut encoder)?;
191
192 Ok(encoder.into())
193 }
194
195 const WIRE_TYPE: WireType;
197
198 fn is_default(&self) -> bool;
199
200 fn encoded_size(
206 &mut self,
207 field: Option<FieldOpt>,
208 builder: &mut SizeBuilder
209 ) -> Result<(), EncodeError>;
210
211 fn encode<B>(
218 &mut self,
219 field: Option<FieldOpt>,
220 encoder: &mut MessageEncoder<B>
221 ) -> Result<(), EncodeError>
222 where B: BytesWrite;
223}
224
225impl<V: EncodeMessage> EncodeMessage for &mut V {
226 const WIRE_TYPE: WireType = V::WIRE_TYPE;
227
228 fn is_default(&self) -> bool {
229 (**self).is_default()
230 }
231
232 fn encoded_size(
233 &mut self,
234 field: Option<FieldOpt>,
235 builder: &mut SizeBuilder
236 ) -> Result<(), EncodeError> {
237 (**self).encoded_size(field, builder)
238 }
239
240 fn encode<B>(
241 &mut self,
242 field: Option<FieldOpt>,
243 encoder: &mut MessageEncoder<B>
244 ) -> Result<(), EncodeError>
245 where B: BytesWrite {
246 (**self).encode(field, encoder)
247 }
248}
249
250macro_rules! impl_from_ref {
251 ($ty:ty) => (
252 impl EncodeMessage for $ty {
253 const WIRE_TYPE: WireType = <&$ty>::WIRE_TYPE;
254
255 fn is_default(&self) -> bool {
256 (&&*self).is_default()
257 }
258
259 fn encoded_size(
260 &mut self,
261 field: Option<FieldOpt>,
262 builder: &mut SizeBuilder
263 ) -> Result<(), EncodeError> {
264 (&mut &*self).encoded_size(field, builder)
265 }
266
267 fn encode<B>(
268 &mut self,
269 field: Option<FieldOpt>,
270 encoder: &mut MessageEncoder<B>
271 ) -> Result<(), EncodeError>
272 where B: BytesWrite {
273 (&mut &*self).encode(field, encoder)
274 }
275 }
276 )
277}
278
279
280impl<V> EncodeMessage for Vec<V>
281where V: EncodeMessage {
282 const WIRE_TYPE: WireType = WireType::Len;
283
284 fn is_default(&self) -> bool {
285 self.is_empty()
286 }
287
288 fn encoded_size(
290 &mut self,
291 field: Option<FieldOpt>,
292 builder: &mut SizeBuilder
293 ) -> Result<(), EncodeError> {
294 self.as_mut_slice().encoded_size(field, builder)
295 }
296
297 fn encode<B>(
298 &mut self,
299 field: Option<FieldOpt>,
300 encoder: &mut MessageEncoder<B>
301 ) -> Result<(), EncodeError>
302 where B: BytesWrite {
303 self.as_mut_slice().encode(field, encoder)
304 }
305}
306
307impl<V, const S: usize> EncodeMessage for [V; S]
308where V: EncodeMessage {
309 const WIRE_TYPE: WireType = WireType::Len;
310
311 fn is_default(&self) -> bool {
312 self.is_empty()
313 }
314
315 fn encoded_size(
317 &mut self,
318 field: Option<FieldOpt>,
319 builder: &mut SizeBuilder
320 ) -> Result<(), EncodeError> {
321 self.as_mut_slice().encoded_size(field, builder)
322 }
323
324 fn encode<B>(
325 &mut self,
326 field: Option<FieldOpt>,
327 encoder: &mut MessageEncoder<B>
328 ) -> Result<(), EncodeError>
329 where B: BytesWrite {
330 self.as_mut_slice().encode(field, encoder)
331 }
332}
333
334
335impl<V> EncodeMessage for [V]
336where V: EncodeMessage {
337 const WIRE_TYPE: WireType = WireType::Len;
338
339 fn is_default(&self) -> bool {
340 self.is_empty()
341 }
342
343 fn encoded_size(
345 &mut self,
346 field: Option<FieldOpt>,
347 builder: &mut SizeBuilder
348 ) -> Result<(), EncodeError> {
349 let field = field.unwrap_or(FieldOpt::new(1));
351
352 if field.is_nested {
355 builder.write_tag(field.num, WireType::Len);
356
357 let mut size = SizeBuilder::new();
358 self.encoded_size(None, &mut size)?;
359 let size = size.finish();
360
361 builder.write_len(size);
362 builder.write_bytes(size);
363 return Ok(())
364 }
365
366 if V::WIRE_TYPE.can_be_packed() && self.len() > 1 {
368 builder.write_tag(field.num, WireType::Len);
369
370 let mut packed_builder = SizeBuilder::new();
371 for v in self.iter_mut() {
372 v.encoded_size(None, &mut packed_builder)?;
373 }
374 let packed_size = packed_builder.finish();
376
377 builder.write_len(packed_size);
378 builder.write_bytes(packed_size);
379 return Ok(())
380 }
381
382 for v in self.iter_mut() {
384 let field = FieldOpt {
385 num: field.num,
386 is_nested: true
387 };
388 v.encoded_size(Some(field), builder)?;
389 }
390
391 Ok(())
392 }
393
394 fn encode<B>(
395 &mut self,
396 field: Option<FieldOpt>,
397 encoder: &mut MessageEncoder<B>
398 ) -> Result<(), EncodeError>
399 where B: BytesWrite {
400 let field = field.unwrap_or(FieldOpt::new(1));
402
403 if field.is_nested {
406 encoder.write_tag(field.num, WireType::Len)?;
407
408 let mut size = SizeBuilder::new();
409 self.encoded_size(None, &mut size)?;
410 let size = size.finish();
411
412 encoder.write_len(size)?;
413
414 #[cfg(debug_assertions)]
415 let prev_len = encoder.written_len();
416
417 self.encode(None, encoder)?;
418
419 #[cfg(debug_assertions)]
420 {
421 let added_len = encoder.written_len() - prev_len;
422 assert_eq!(size, added_len as u64,
423 "size does not match real size");
424 }
425
426 return Ok(())
427 }
428
429 if V::WIRE_TYPE.can_be_packed() && self.len() > 1 {
431 encoder.write_tag(field.num, WireType::Len)?;
432
433 let mut packed_builder = SizeBuilder::new();
434 for v in self.iter_mut() {
435 v.encoded_size(None, &mut packed_builder)?;
436 }
437 let packed_size = packed_builder.finish();
439
440 encoder.write_len(packed_size)?;
441
442 #[cfg(debug_assertions)]
443 let prev_len = encoder.written_len();
444
445 for v in self.iter_mut() {
446 v.encode(None, encoder)?;
447 }
448
449 #[cfg(debug_assertions)]
450 {
451 let added_len = encoder.written_len() - prev_len;
452 assert_eq!(packed_size, added_len as u64,
453 "size does not match real size");
454 }
455
456 return Ok(())
457 }
458
459 for v in self.iter_mut() {
461 let field = FieldOpt {
462 num: field.num,
463 is_nested: true
464 };
465 v.encode(Some(field), encoder)?;
466 }
467
468 Ok(())
469 }
470}
471
472impl<K, V> EncodeMessage for HashMap<K, V>
473where
474 for<'a> &'a K: EncodeMessage,
475 V: EncodeMessage
476{
477 const WIRE_TYPE: WireType = WireType::Len;
478
479 fn is_default(&self) -> bool {
480 self.is_empty()
481 }
482
483 fn encoded_size(
485 &mut self,
486 field: Option<FieldOpt>,
487 builder: &mut SizeBuilder
488 ) -> Result<(), EncodeError> {
489 let field = field.unwrap_or(FieldOpt::new(1));
491
492 if field.is_nested {
495 builder.write_tag(field.num, WireType::Len);
496
497 let mut size = SizeBuilder::new();
498 self.encoded_size(None, &mut size)?;
500 let size = size.finish();
501
502 builder.write_len(size);
503 builder.write_bytes(size);
504 return Ok(())
505 }
506
507 for (k, v) in self.iter_mut() {
509 let field = FieldOpt {
510 num: field.num,
511 is_nested: true
512 };
513 (k, v).encoded_size(Some(field), builder)?;
514 }
515
516 Ok(())
517 }
518
519 fn encode<B>(
520 &mut self,
521 field: Option<FieldOpt>,
522 encoder: &mut MessageEncoder<B>
523 ) -> Result<(), EncodeError>
524 where B: BytesWrite {
525 let field = field.unwrap_or(FieldOpt::new(1));
527
528 if field.is_nested {
531 encoder.write_tag(field.num, WireType::Len)?;
532
533 let mut size = SizeBuilder::new();
534 self.encoded_size(None, &mut size)?;
535 let size = size.finish();
536
537 encoder.write_len(size)?;
538
539 #[cfg(debug_assertions)]
540 let prev_len = encoder.written_len();
541
542 self.encode(None, encoder)?;
543
544 #[cfg(debug_assertions)]
545 {
546 let added_len = encoder.written_len() - prev_len;
547 assert_eq!(size, added_len as u64,
548 "size does not match real size");
549 }
550
551 return Ok(())
552 }
553
554 for (k, v) in self.iter_mut() {
556 let field = FieldOpt {
557 num: field.num,
558 is_nested: true
559 };
560 (k, v).encode(Some(field), encoder)?;
561 }
562
563 Ok(())
564 }
565}
566
567impl EncodeMessage for Vec<u8> {
568 const WIRE_TYPE: WireType = WireType::Len;
569
570 fn is_default(&self) -> bool {
571 self.as_slice().is_default()
572 }
573
574 fn encoded_size(
576 &mut self,
577 field: Option<FieldOpt>,
578 builder: &mut SizeBuilder
579 ) -> Result<(), EncodeError> {
580 self.as_slice().encoded_size(field, builder)
581 }
582
583 fn encode<B>(
584 &mut self,
585 field: Option<FieldOpt>,
586 encoder: &mut MessageEncoder<B>
587 ) -> Result<(), EncodeError>
588 where B: BytesWrite {
589 self.as_slice().encode(field, encoder)
590 }
591}
592
593impl<const S: usize> EncodeMessage for [u8; S] {
594 const WIRE_TYPE: WireType = WireType::Len;
595
596 fn is_default(&self) -> bool {
597 self.as_slice().is_default()
598 }
599
600 fn encoded_size(
602 &mut self,
603 field: Option<FieldOpt>,
604 builder: &mut SizeBuilder
605 ) -> Result<(), EncodeError> {
606 self.as_slice().encoded_size(field, builder)
607 }
608
609 fn encode<B>(
610 &mut self,
611 field: Option<FieldOpt>,
612 encoder: &mut MessageEncoder<B>
613 ) -> Result<(), EncodeError>
614 where B: BytesWrite {
615 self.as_slice().encode(field, encoder)
616 }
617}
618
619macro_rules! impl_tuple {
621 ($($gen:ident, $idx:tt),*) => (
622 impl<$($gen),*> EncodeMessage for ($($gen),*)
623 where
624 $($gen: EncodeMessage),*
625 {
626 const WIRE_TYPE: WireType = WireType::Len;
627
628 fn is_default(&self) -> bool {
629 false
630 }
631
632 fn encoded_size(
634 &mut self,
635 field: Option<FieldOpt>,
636 builder: &mut SizeBuilder
637 ) -> Result<(), EncodeError> {
638 let mut size = SizeBuilder::new();
639 $(
640 if !self.$idx.is_default() {
641 self.$idx.encoded_size(
642 Some(FieldOpt::new($idx)),
643 &mut size
644 )?;
645 }
646 )*
647 let fields_size = size.finish();
648
649 if let Some(field) = field {
650 builder.write_tag(field.num, Self::WIRE_TYPE);
651 builder.write_len(fields_size);
652 }
653
654 builder.write_bytes(fields_size);
655
656 Ok(())
657 }
658
659 fn encode<Bytes>(
660 &mut self,
661 field: Option<FieldOpt>,
662 encoder: &mut MessageEncoder<Bytes>
663 ) -> Result<(), EncodeError>
664 where Bytes: BytesWrite {
665 #[cfg(debug_assertions)]
666 let mut dbg_fields_size = None;
667
668 if let Some(field) = field {
671 encoder.write_tag(field.num, Self::WIRE_TYPE)?;
672
673 let mut size = SizeBuilder::new();
674 $(
675 if !self.$idx.is_default() {
676 self.$idx.encoded_size(
677 Some(FieldOpt::new($idx)),
678 &mut size
679 )?;
680 }
681 )*
682 let fields_size = size.finish();
683
684 encoder.write_len(fields_size)?;
685
686 #[cfg(debug_assertions)]
687 {
688 dbg_fields_size = Some(fields_size);
689 }
690 }
691
692 #[cfg(debug_assertions)]
693 let prev_len = encoder.written_len();
694
695 $(
696 if !self.$idx.is_default() {
697 self.$idx.encode(
698 Some(FieldOpt::new($idx)),
699 encoder
700 )?;
701 }
702 )*
703
704 #[cfg(debug_assertions)]
705 if let Some(fields_size) = dbg_fields_size {
706 let added_len = encoder.written_len() - prev_len;
707 assert_eq!(fields_size, added_len as u64,
708 "encoded size does not match actual size");
709 }
710
711 Ok(())
712 }
713 }
714 )
715}
716
717impl_tuple![
721 A, 0,
722 B, 1
723];
724impl_tuple![
725 A, 0,
726 B, 1,
727 C, 2
728];
729impl_tuple![
730 A, 0,
731 B, 1,
732 C, 2,
733 D, 3
734];
735impl_tuple![
736 A, 0,
737 B, 1,
738 C, 2,
739 D, 3,
740 E, 4
741];
742impl_tuple![
743 A, 0,
744 B, 1,
745 C, 2,
746 D, 3,
747 E, 4,
748 F, 5
749];
750
751impl_from_ref!([u8]);
752
753impl EncodeMessage for &[u8] {
754 const WIRE_TYPE: WireType = WireType::Len;
755
756 fn is_default(&self) -> bool {
757 self.is_empty()
758 }
759
760 fn encoded_size(
762 &mut self,
763 field: Option<FieldOpt>,
764 writer: &mut SizeBuilder
765 ) -> Result<(), EncodeError> {
766 if let Some(field) = field {
767 writer.write_tag(field.num, Self::WIRE_TYPE);
768 writer.write_len(self.len() as u64);
769 }
770
771 writer.write_bytes(self.len() as u64);
772
773 Ok(())
774 }
775
776 fn encode<B>(
777 &mut self,
778 field: Option<FieldOpt>,
779 writer: &mut MessageEncoder<B>
780 ) -> Result<(), EncodeError>
781 where B: BytesWrite {
782 if let Some(field) = field {
783 writer.write_tag(field.num, Self::WIRE_TYPE)?;
784 writer.write_len(self.len() as u64)?;
785 }
786
787 writer.write_bytes(self)
788 }
789}
790
791impl_from_ref!(String);
792
793impl EncodeMessage for &String {
794 const WIRE_TYPE: WireType = WireType::Len;
795
796 fn is_default(&self) -> bool {
797 self.as_bytes().is_default()
798 }
799
800 fn encoded_size(
802 &mut self,
803 field: Option<FieldOpt>,
804 builder: &mut SizeBuilder
805 ) -> Result<(), EncodeError> {
806 self.as_bytes().encoded_size(field, builder)
807 }
808
809 fn encode<B>(
810 &mut self,
811 field: Option<FieldOpt>,
812 encoder: &mut MessageEncoder<B>
813 ) -> Result<(), EncodeError>
814 where B: BytesWrite {
815 self.as_bytes().encode(field, encoder)
816 }
817}
818
819impl EncodeMessage for &str {
820 const WIRE_TYPE: WireType = WireType::Len;
821
822 fn is_default(&self) -> bool {
823 self.as_bytes().is_default()
824 }
825
826 fn encoded_size(
828 &mut self,
829 field: Option<FieldOpt>,
830 builder: &mut SizeBuilder
831 ) -> Result<(), EncodeError> {
832 self.as_bytes().encoded_size(field, builder)
833 }
834
835 fn encode<B>(
836 &mut self,
837 field: Option<FieldOpt>,
838 encoder: &mut MessageEncoder<B>
839 ) -> Result<(), EncodeError>
840 where B: BytesWrite {
841 self.as_bytes().encode(field, encoder)
842 }
843}
844
845impl<T> EncodeMessage for Option<T>
846where T: EncodeMessage {
847 const WIRE_TYPE: WireType = WireType::Len;
848
849 fn is_default(&self) -> bool {
850 self.is_none()
851 }
852
853 fn encoded_size(
854 &mut self,
855 field: Option<FieldOpt>,
856 builder: &mut SizeBuilder
857 ) -> Result<(), EncodeError> {
858 let field = field.unwrap_or(FieldOpt::new(1));
859
860 if field.is_nested {
861 builder.write_tag(field.num, WireType::Len);
862
863 let mut size = SizeBuilder::new();
864 self.encoded_size(None, &mut size)?;
865 let size = size.finish();
866
867 builder.write_len(size);
868 builder.write_bytes(size);
869
870 return Ok(())
871 }
872
873 match self {
874 Some(v) => v.encoded_size(
875 Some(FieldOpt {
876 num: field.num,
877 is_nested: true
878 }),
879 builder
880 ),
881 None => Ok(())
882 }
883 }
884
885 fn encode<B>(
886 &mut self,
887 field: Option<FieldOpt>,
888 encoder: &mut MessageEncoder<B>
889 ) -> Result<(), EncodeError>
890 where B: BytesWrite {
891 let field = field.unwrap_or(FieldOpt::new(1));
892
893 if field.is_nested {
894 encoder.write_tag(field.num, WireType::Len)?;
895
896 let mut size = SizeBuilder::new();
897 self.encoded_size(None, &mut size)?;
898 let size = size.finish();
899
900 encoder.write_len(size)?;
901
902 #[cfg(debug_assertions)]
903 let prev_len = encoder.written_len();
904
905 self.encode(None, encoder)?;
906
907 #[cfg(debug_assertions)]
908 {
909 let added_len = encoder.written_len() - prev_len;
910 assert_eq!(size, added_len as u64,
911 "size does not match real size");
912 }
913
914 return Ok(())
915 }
916
917 match self {
918 Some(v) => v.encode(
919 Some(FieldOpt {
920 num: field.num,
921 is_nested: true
922 }),
923 encoder
924 ),
925 None => Ok(())
926 }
927 }
928}
929
930impl_from_ref!(bool);
931
932impl EncodeMessage for &bool {
933 const WIRE_TYPE: WireType = WireType::Varint;
934
935 fn is_default(&self) -> bool {
936 **self == false
937 }
938
939 fn encoded_size(
940 &mut self,
941 field: Option<FieldOpt>,
942 builder: &mut SizeBuilder
943 ) -> Result<(), EncodeError> {
944 if let Some(field) = field {
945 builder.write_tag(field.num, Self::WIRE_TYPE);
946 }
947
948 builder.write_varint(**self as u64);
949
950 Ok(())
951 }
952
953 fn encode<B>(
954 &mut self,
955 field: Option<FieldOpt>,
956 encoder: &mut MessageEncoder<B>
957 ) -> Result<(), EncodeError>
958 where B: BytesWrite {
959 if let Some(field) = field {
960 encoder.write_tag(field.num, Self::WIRE_TYPE)?;
961 }
962
963 encoder.write_varint(**self as u64)
964 }
965}
966
967
968macro_rules! impl_varint {
970 ($($ty:ty),*) => ($(
971 impl_from_ref!($ty);
972
973 impl EncodeMessage for &$ty {
974 const WIRE_TYPE: WireType = WireType::Varint;
975
976 fn is_default(&self) -> bool {
977 **self == 0
978 }
979
980 fn encoded_size(
981 &mut self,
982 field: Option<FieldOpt>,
983 builder: &mut SizeBuilder
984 ) -> Result<(), EncodeError> {
985 if let Some(field) = field {
986 builder.write_tag(field.num, Self::WIRE_TYPE);
987 }
988
989 builder.write_varint(**self as u64);
990
991 Ok(())
992 }
993
994 fn encode<B>(
995 &mut self,
996 field: Option<FieldOpt>,
997 encoder: &mut MessageEncoder<B>
998 ) -> Result<(), EncodeError>
999 where B: BytesWrite {
1000 if let Some(field) = field {
1001 encoder.write_tag(field.num, Self::WIRE_TYPE)?;
1002 }
1003
1004 encoder.write_varint(**self as u64)
1005 }
1006 }
1007 )*)
1008}
1009
1010impl_varint![i32, i64, u32, u64];
1011
1012macro_rules! impl_floats {
1013 ($($src:ident, $wty:ident, $wtype:ident as $ty:ty),*) => ($(
1014 impl_from_ref!($ty);
1015
1016 impl EncodeMessage for &$ty {
1017 const WIRE_TYPE: WireType = WireType::$wtype;
1018
1019 fn is_default(&self) -> bool {
1020 **self == 0 as $ty
1021 }
1022
1023 fn encoded_size(
1024 &mut self,
1025 field: Option<FieldOpt>,
1026 builder: &mut SizeBuilder
1027 ) -> Result<(), EncodeError> {
1028 if let Some(field) = field {
1029 builder.write_tag(field.num, Self::WIRE_TYPE);
1030 }
1031
1032 builder.$src(**self as $wty);
1033
1034 Ok(())
1035 }
1036
1037 fn encode<B>(
1038 &mut self,
1039 field: Option<FieldOpt>,
1040 encoder: &mut MessageEncoder<B>
1041 ) -> Result<(), EncodeError>
1042 where B: BytesWrite {
1043 if let Some(field) = field {
1044 encoder.write_tag(field.num, Self::WIRE_TYPE)?;
1045 }
1046
1047 encoder.$src(**self as $wty)
1048 }
1049 }
1050 )*)
1051}
1052
1053impl_floats![
1054 write_i32, u32, I32 as f32,
1055 write_i64, u64, I64 as f64
1056];