1use std::any::Any;
2use std::any::TypeId;
3use std::fmt;
4use std::io::Read;
5use std::io::Write;
6
7#[cfg(feature = "bytes")]
8use bytes::Bytes;
9
10use crate::clear::Clear;
11use crate::coded_input_stream::CodedInputStream;
12use crate::coded_input_stream::WithCodedInputStream;
13use crate::coded_output_stream::with_coded_output_stream_to_bytes;
14use crate::coded_output_stream::CodedOutputStream;
15use crate::coded_output_stream::WithCodedOutputStream;
16use crate::error::ProtobufError;
17use crate::error::ProtobufResult;
18use crate::reflect::MessageDescriptor;
19use crate::unknown::UnknownFields;
20
21pub trait Message: fmt::Debug + Clear + Any + Send + Sync {
25 fn descriptor(&self) -> &'static MessageDescriptor;
27
28 fn is_initialized(&self) -> bool;
31
32 fn merge_from(&mut self, is: &mut CodedInputStream) -> ProtobufResult<()>;
34
35 fn parse_from(is: &mut CodedInputStream) -> ProtobufResult<Self>
37 where
38 Self: Sized,
39 {
40 let mut r: Self = Message::new();
41 r.merge_from(is)?;
42 r.check_initialized()?;
43 Ok(r)
44 }
45
46 fn write_to_with_cached_sizes(&self, os: &mut CodedOutputStream) -> ProtobufResult<()>;
51
52 fn compute_size(&self) -> u32;
54
55 fn get_cached_size(&self) -> u32;
57
58 fn write_to(&self, os: &mut CodedOutputStream) -> ProtobufResult<()> {
62 self.check_initialized()?;
63
64 self.compute_size();
66 self.write_to_with_cached_sizes(os)?;
68
69 Ok(())
70 }
71
72 fn write_length_delimited_to(&self, os: &mut CodedOutputStream) -> ProtobufResult<()> {
75 let size = self.compute_size();
76 os.write_raw_varint32(size)?;
77 self.write_to_with_cached_sizes(os)?;
78
79 Ok(())
82 }
83
84 fn write_length_delimited_to_vec(&self, vec: &mut Vec<u8>) -> ProtobufResult<()> {
87 let mut os = CodedOutputStream::vec(vec);
88 self.write_length_delimited_to(&mut os)?;
89 os.flush()?;
90 Ok(())
91 }
92
93 fn merge_from_bytes(&mut self, bytes: &[u8]) -> ProtobufResult<()> {
95 let mut is = CodedInputStream::from_bytes(bytes);
96 self.merge_from(&mut is)
97 }
98
99 fn parse_from_reader(reader: &mut dyn Read) -> ProtobufResult<Self>
102 where
103 Self: Sized,
104 {
105 let mut is = CodedInputStream::new(reader);
106 let r = Message::parse_from(&mut is)?;
107 is.check_eof()?;
108 Ok(r)
109 }
110
111 fn parse_from_bytes(bytes: &[u8]) -> ProtobufResult<Self>
113 where
114 Self: Sized,
115 {
116 let mut is = CodedInputStream::from_bytes(bytes);
117 let r = Message::parse_from(&mut is)?;
118 is.check_eof()?;
119 Ok(r)
120 }
121
122 #[cfg(feature = "bytes")]
125 fn parse_from_carllerche_bytes(bytes: &Bytes) -> ProtobufResult<Self>
126 where
127 Self: Sized,
128 {
129 let mut is = CodedInputStream::from_carllerche_bytes(bytes);
130 let r = Self::parse_from(&mut is)?;
131 is.check_eof()?;
132 Ok(r)
133 }
134
135 fn check_initialized(&self) -> ProtobufResult<()> {
137 if !self.is_initialized() {
138 Err(ProtobufError::message_not_initialized(
139 self.descriptor().name(),
140 ))
141 } else {
142 Ok(())
143 }
144 }
145
146 fn write_to_writer(&self, w: &mut dyn Write) -> ProtobufResult<()> {
148 w.with_coded_output_stream(|os| self.write_to(os))
149 }
150
151 fn write_to_vec(&self, v: &mut Vec<u8>) -> ProtobufResult<()> {
153 v.with_coded_output_stream(|os| self.write_to(os))
154 }
155
156 fn write_to_bytes(&self) -> ProtobufResult<Vec<u8>> {
158 self.check_initialized()?;
159
160 let size = self.compute_size() as usize;
161 let mut v = Vec::with_capacity(size);
162 unsafe {
164 v.set_len(size);
165 }
166 {
167 let mut os = CodedOutputStream::bytes(&mut v);
168 self.write_to_with_cached_sizes(&mut os)?;
169 os.check_eof();
170 }
171 Ok(v)
172 }
173
174 fn write_length_delimited_to_writer(&self, w: &mut dyn Write) -> ProtobufResult<()> {
177 w.with_coded_output_stream(|os| self.write_length_delimited_to(os))
178 }
179
180 fn write_length_delimited_to_bytes(&self) -> ProtobufResult<Vec<u8>> {
183 with_coded_output_stream_to_bytes(|os| self.write_length_delimited_to(os))
184 }
185
186 fn get_unknown_fields<'s>(&'s self) -> &'s UnknownFields;
188 fn mut_unknown_fields<'s>(&'s mut self) -> &'s mut UnknownFields;
190
191 fn type_id(&self) -> TypeId {
193 TypeId::of::<Self>()
194 }
195
196 fn as_any(&self) -> &dyn Any;
198
199 fn as_any_mut(&mut self) -> &mut dyn Any {
201 panic!()
202 }
203
204 fn into_any(self: Box<Self>) -> Box<dyn Any> {
206 panic!()
207 }
208
209 fn new() -> Self
224 where
225 Self: Sized;
226
227 fn descriptor_static() -> &'static MessageDescriptor
237 where
238 Self: Sized,
239 {
240 panic!(
241 "descriptor_static is not implemented for message, \
242 LITE_RUNTIME must be used"
243 );
244 }
245
246 fn default_instance() -> &'static Self
255 where
256 Self: Sized;
257}
258
259pub fn message_down_cast<'a, M: Message + 'a>(m: &'a dyn Message) -> &'a M {
260 m.as_any().downcast_ref::<M>().unwrap()
261}
262
263#[deprecated(since = "2.19", note = "Use Message::parse_from_reader instead")]
266pub fn parse_from_reader<M: Message>(reader: &mut dyn Read) -> ProtobufResult<M> {
267 M::parse_from_reader(reader)
268}
269
270#[deprecated(since = "2.19", note = "Use Message::parse_from_bytes instead")]
272pub fn parse_from_bytes<M: Message>(bytes: &[u8]) -> ProtobufResult<M> {
273 M::parse_from_bytes(bytes)
274}
275
276#[cfg(feature = "bytes")]
279#[deprecated(
280 since = "2.19",
281 note = "Use Message::parse_from_carllerche_bytes instead"
282)]
283pub fn parse_from_carllerche_bytes<M: Message>(bytes: &Bytes) -> ProtobufResult<M> {
284 M::parse_from_carllerche_bytes(bytes)
285}
286
287#[deprecated]
293pub fn parse_length_delimited_from<M: Message>(is: &mut CodedInputStream) -> ProtobufResult<M> {
294 is.read_message::<M>()
295}
296
297#[deprecated]
301pub fn parse_length_delimited_from_reader<M: Message>(r: &mut dyn Read) -> ProtobufResult<M> {
302 r.with_coded_input_stream(|is| is.read_message::<M>())
304}
305
306#[deprecated]
310pub fn parse_length_delimited_from_bytes<M: Message>(bytes: &[u8]) -> ProtobufResult<M> {
311 bytes.with_coded_input_stream(|is| is.read_message::<M>())
312}