1use std::fmt::Debug;
2use std::usize;
3
4use bytes::{Buf, BufMut};
5
6use DecodeError;
7use EncodeError;
8
9use crate::encoding::{encode_varint, encoded_len_varint, message, WireType};
10pub trait Message: Debug + Send + Sync {
12 #[doc(hidden)]
18 fn encode_raw<B>(&self, buf: &mut B)
19 where
20 B: BufMut,
21 Self: Sized;
22
23 #[doc(hidden)]
27 fn merge_field<B>(&mut self, buf: &mut B) -> Result<(), DecodeError>
28 where
29 B: Buf,
30 Self: Sized;
31
32 fn encoded_len(&self) -> usize;
34
35 fn encode<B>(&self, buf: &mut B) -> Result<(), EncodeError>
39 where
40 B: BufMut,
41 Self: Sized,
42 {
43 let required = self.encoded_len();
44 let remaining = buf.remaining_mut();
45 if required > buf.remaining_mut() {
46 return Err(EncodeError::new(required, remaining));
47 }
48
49 self.encode_raw(buf);
50 Ok(())
51 }
52
53 fn encode_length_delimited<B>(&self, buf: &mut B) -> Result<(), EncodeError>
57 where
58 B: BufMut,
59 Self: Sized,
60 {
61 let len = self.encoded_len();
62 let required = len + encoded_len_varint(len as u64);
63 let remaining = buf.remaining_mut();
64 if required > remaining {
65 return Err(EncodeError::new(required, remaining));
66 }
67 encode_varint(len as u64, buf);
68 self.encode_raw(buf);
69 Ok(())
70 }
71
72 fn decode<B>(mut buf: B) -> Result<Self, DecodeError>
76 where
77 B: Buf,
78 Self: Default,
79 {
80 let mut message = Self::default();
81 Self::merge(&mut message, &mut buf).map(|_| message)
82 }
83
84 fn decode_length_delimited<B>(buf: B) -> Result<Self, DecodeError>
86 where
87 B: Buf,
88 Self: Default,
89 {
90 let mut message = Self::default();
91 message.merge_length_delimited(buf)?;
92 Ok(message)
93 }
94
95 fn merge<B>(&mut self, buf: B) -> Result<(), DecodeError>
99 where
100 B: Buf,
101 Self: Sized,
102 {
103 let mut buf = buf;
104 while buf.has_remaining() {
105 self.merge_field(&mut buf)?;
106 }
107 Ok(())
108 }
109
110 fn merge_length_delimited<B>(&mut self, mut buf: B) -> Result<(), DecodeError>
113 where
114 B: Buf,
115 Self: Sized,
116 {
117 message::merge(WireType::LengthDelimited, self, &mut buf)
118 }
119
120 fn clear(&mut self);
122}
123
124impl<M> Message for Box<M>
125where
126 M: Message,
127{
128 fn encode_raw<B>(&self, buf: &mut B)
129 where
130 B: BufMut,
131 {
132 (**self).encode_raw(buf)
133 }
134 fn merge_field<B>(&mut self, buf: &mut B) -> Result<(), DecodeError>
135 where
136 B: Buf,
137 {
138 (**self).merge_field(buf)
139 }
140 fn encoded_len(&self) -> usize {
141 (**self).encoded_len()
142 }
143 fn clear(&mut self) {
144 (**self).clear()
145 }
146}