1use alloc::boxed::Box;
2use core::fmt::Debug;
3use core::usize;
4
5use bytes::{Buf, BufMut};
6
7use crate::encoding::{
8 decode_key, encode_varint, encoded_len_varint, message, DecodeContext, WireType,
9};
10use crate::DecodeError;
11use crate::EncodeError;
12
13pub trait Message: Debug + Send + Sync {
15 #[doc(hidden)]
21 fn encode_raw<B>(&self, buf: &mut B)
22 where
23 B: BufMut,
24 Self: Sized;
25
26 #[doc(hidden)]
30 fn merge_field<B>(
31 &mut self,
32 tag: u32,
33 wire_type: WireType,
34 buf: &mut B,
35 ctx: DecodeContext,
36 ) -> Result<(), DecodeError>
37 where
38 B: Buf,
39 Self: Sized;
40
41 fn encoded_len(&self) -> usize;
43
44 fn encode<B>(&self, buf: &mut B) -> Result<(), EncodeError>
48 where
49 B: BufMut,
50 Self: Sized,
51 {
52 let required = self.encoded_len();
53 let remaining = buf.remaining_mut();
54 if required > buf.remaining_mut() {
55 return Err(EncodeError::new(required, remaining));
56 }
57
58 self.encode_raw(buf);
59 Ok(())
60 }
61
62 #[cfg(feature = "std")]
63 fn encode_to_vec(&self) -> Vec<u8>
65 where
66 Self: Sized,
67 {
68 let mut buf = Vec::with_capacity(self.encoded_len());
69
70 self.encode_raw(&mut buf);
71 buf
72 }
73
74 fn encode_length_delimited<B>(&self, buf: &mut B) -> Result<(), EncodeError>
78 where
79 B: BufMut,
80 Self: Sized,
81 {
82 let len = self.encoded_len();
83 let required = len + encoded_len_varint(len as u64);
84 let remaining = buf.remaining_mut();
85 if required > remaining {
86 return Err(EncodeError::new(required, remaining));
87 }
88 encode_varint(len as u64, buf);
89 self.encode_raw(buf);
90 Ok(())
91 }
92
93 #[cfg(feature = "std")]
94 fn encode_length_delimited_to_vec(&self) -> Vec<u8>
96 where
97 Self: Sized,
98 {
99 let len = self.encoded_len();
100 let mut buf = Vec::with_capacity(len + encoded_len_varint(len as u64));
101
102 encode_varint(len as u64, &mut buf);
103 self.encode_raw(&mut buf);
104 buf
105 }
106
107 fn decode<B>(mut buf: B) -> Result<Self, DecodeError>
111 where
112 B: Buf,
113 Self: Default,
114 {
115 let mut message = Self::default();
116 Self::merge(&mut message, &mut buf).map(|_| message)
117 }
118
119 fn decode_length_delimited<B>(buf: B) -> Result<Self, DecodeError>
121 where
122 B: Buf,
123 Self: Default,
124 {
125 let mut message = Self::default();
126 message.merge_length_delimited(buf)?;
127 Ok(message)
128 }
129
130 fn merge<B>(&mut self, mut buf: B) -> Result<(), DecodeError>
134 where
135 B: Buf,
136 Self: Sized,
137 {
138 let ctx = DecodeContext::default();
139 while buf.has_remaining() {
140 let (tag, wire_type) = decode_key(&mut buf)?;
141 self.merge_field(tag, wire_type, &mut buf, ctx.clone())?;
142 }
143 Ok(())
144 }
145
146 fn merge_length_delimited<B>(&mut self, mut buf: B) -> Result<(), DecodeError>
149 where
150 B: Buf,
151 Self: Sized,
152 {
153 message::merge(
154 WireType::LengthDelimited,
155 self,
156 &mut buf,
157 DecodeContext::default(),
158 )
159 }
160
161 fn clear(&mut self);
163}
164
165impl<M> Message for Box<M>
166where
167 M: Message,
168{
169 fn encode_raw<B>(&self, buf: &mut B)
170 where
171 B: BufMut,
172 {
173 (**self).encode_raw(buf)
174 }
175 fn merge_field<B>(
176 &mut self,
177 tag: u32,
178 wire_type: WireType,
179 buf: &mut B,
180 ctx: DecodeContext,
181 ) -> Result<(), DecodeError>
182 where
183 B: Buf,
184 {
185 (**self).merge_field(tag, wire_type, buf, ctx)
186 }
187 fn encoded_len(&self) -> usize {
188 (**self).encoded_len()
189 }
190 fn clear(&mut self) {
191 (**self).clear()
192 }
193}
194
195#[cfg(test)]
196mod tests {
197 use super::*;
198
199 const _MESSAGE_IS_OBJECT_SAFE: Option<&dyn Message> = None;
200}