• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use std::any::Any;
2 use std::any::TypeId;
3 use std::fmt;
4 use std::io::Read;
5 use std::io::Write;
6 
7 #[cfg(feature = "bytes")]
8 use bytes::Bytes;
9 
10 use crate::clear::Clear;
11 use crate::coded_input_stream::CodedInputStream;
12 use crate::coded_input_stream::WithCodedInputStream;
13 use crate::coded_output_stream::with_coded_output_stream_to_bytes;
14 use crate::coded_output_stream::CodedOutputStream;
15 use crate::coded_output_stream::WithCodedOutputStream;
16 use crate::error::ProtobufError;
17 use crate::error::ProtobufResult;
18 use crate::reflect::MessageDescriptor;
19 use crate::unknown::UnknownFields;
20 
21 /// Trait implemented for all generated structs for protobuf messages.
22 ///
23 /// Also, generated messages implement `Clone + Default + PartialEq`
24 pub trait Message: fmt::Debug + Clear + Any + Send + Sync {
25     /// Message descriptor for this message, used for reflection.
descriptor(&self) -> &'static MessageDescriptor26     fn descriptor(&self) -> &'static MessageDescriptor;
27 
28     /// True iff all required fields are initialized.
29     /// Always returns `true` for protobuf 3.
is_initialized(&self) -> bool30     fn is_initialized(&self) -> bool;
31 
32     /// Update this message object with fields read from given stream.
merge_from(&mut self, is: &mut CodedInputStream) -> ProtobufResult<()>33     fn merge_from(&mut self, is: &mut CodedInputStream) -> ProtobufResult<()>;
34 
35     /// Parse message from stream.
parse_from(is: &mut CodedInputStream) -> ProtobufResult<Self> where Self: Sized,36     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     /// Write message to the stream.
47     ///
48     /// Sizes of this messages and nested messages must be cached
49     /// by calling `compute_size` prior to this call.
write_to_with_cached_sizes(&self, os: &mut CodedOutputStream) -> ProtobufResult<()>50     fn write_to_with_cached_sizes(&self, os: &mut CodedOutputStream) -> ProtobufResult<()>;
51 
52     /// Compute and cache size of this message and all nested messages
compute_size(&self) -> u3253     fn compute_size(&self) -> u32;
54 
55     /// Get size previously computed by `compute_size`.
get_cached_size(&self) -> u3256     fn get_cached_size(&self) -> u32;
57 
58     /// Write the message to the stream.
59     ///
60     /// Results in error if message is not fully initialized.
write_to(&self, os: &mut CodedOutputStream) -> ProtobufResult<()>61     fn write_to(&self, os: &mut CodedOutputStream) -> ProtobufResult<()> {
62         self.check_initialized()?;
63 
64         // cache sizes
65         self.compute_size();
66         // TODO: reserve additional
67         self.write_to_with_cached_sizes(os)?;
68 
69         Ok(())
70     }
71 
72     /// Write the message to the stream prepending the message with message length
73     /// encoded as varint.
write_length_delimited_to(&self, os: &mut CodedOutputStream) -> ProtobufResult<()>74     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         // TODO: assert we've written same number of bytes as computed
80 
81         Ok(())
82     }
83 
84     /// Write the message to the vec, prepend the message with message length
85     /// encoded as varint.
write_length_delimited_to_vec(&self, vec: &mut Vec<u8>) -> ProtobufResult<()>86     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     /// Update this message object with fields read from given stream.
merge_from_bytes(&mut self, bytes: &[u8]) -> ProtobufResult<()>94     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     /// Parse message from reader.
100     /// Parse stops on EOF or when error encountered.
parse_from_reader(reader: &mut dyn Read) -> ProtobufResult<Self> where Self: Sized,101     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     /// Parse message from byte array.
parse_from_bytes(bytes: &[u8]) -> ProtobufResult<Self> where Self: Sized,112     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     /// Parse message from `Bytes` object.
123     /// Resulting message may share references to the passed bytes object.
124     #[cfg(feature = "bytes")]
parse_from_carllerche_bytes(bytes: &Bytes) -> ProtobufResult<Self> where Self: Sized,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     /// Check if all required fields of this object are initialized.
check_initialized(&self) -> ProtobufResult<()>136     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     /// Write the message to the writer.
write_to_writer(&self, w: &mut dyn Write) -> ProtobufResult<()>147     fn write_to_writer(&self, w: &mut dyn Write) -> ProtobufResult<()> {
148         w.with_coded_output_stream(|os| self.write_to(os))
149     }
150 
151     /// Write the message to bytes vec.
write_to_vec(&self, v: &mut Vec<u8>) -> ProtobufResult<()>152     fn write_to_vec(&self, v: &mut Vec<u8>) -> ProtobufResult<()> {
153         v.with_coded_output_stream(|os| self.write_to(os))
154     }
155 
156     /// Write the message to bytes vec.
write_to_bytes(&self) -> ProtobufResult<Vec<u8>>157     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         // skip zerofill
163         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     /// Write the message to the writer, prepend the message with message length
175     /// encoded as varint.
write_length_delimited_to_writer(&self, w: &mut dyn Write) -> ProtobufResult<()>176     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     /// Write the message to the bytes vec, prepend the message with message length
181     /// encoded as varint.
write_length_delimited_to_bytes(&self) -> ProtobufResult<Vec<u8>>182     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     /// Get a reference to unknown fields.
get_unknown_fields<'s>(&'s self) -> &'s UnknownFields187     fn get_unknown_fields<'s>(&'s self) -> &'s UnknownFields;
188     /// Get a mutable reference to unknown fields.
mut_unknown_fields<'s>(&'s mut self) -> &'s mut UnknownFields189     fn mut_unknown_fields<'s>(&'s mut self) -> &'s mut UnknownFields;
190 
191     /// Get type id for downcasting.
type_id(&self) -> TypeId192     fn type_id(&self) -> TypeId {
193         TypeId::of::<Self>()
194     }
195 
196     /// View self as `Any`.
as_any(&self) -> &dyn Any197     fn as_any(&self) -> &dyn Any;
198 
199     /// View self as mutable `Any`.
as_any_mut(&mut self) -> &mut dyn Any200     fn as_any_mut(&mut self) -> &mut dyn Any {
201         panic!()
202     }
203 
204     /// Convert boxed self to boxed `Any`.
into_any(self: Box<Self>) -> Box<dyn Any>205     fn into_any(self: Box<Self>) -> Box<dyn Any> {
206         panic!()
207     }
208 
209     // Rust does not allow implementation of trait for trait:
210     // impl<M : Message> fmt::Debug for M {
211     // ...
212     // }
213 
214     /// Create an empty message object.
215     ///
216     ///
217     /// ```
218     /// # use protobuf::Message;
219     /// # fn foo<MyMessage: Message>() {
220     /// let m = MyMessage::new();
221     /// # }
222     /// ```
new() -> Self where Self: Sized223     fn new() -> Self
224     where
225         Self: Sized;
226 
227     /// Get message descriptor for message type.
228     ///
229     /// ```
230     /// # use protobuf::Message;
231     /// # fn foo<MyMessage: Message>() {
232     /// let descriptor = MyMessage::descriptor_static();
233     /// assert_eq!("MyMessage", descriptor.name());
234     /// # }
235     /// ```
descriptor_static() -> &'static MessageDescriptor where Self: Sized,236     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     /// Return a pointer to default immutable message with static lifetime.
247     ///
248     /// ```
249     /// # use protobuf::Message;
250     /// # fn foo<MyMessage: Message>() {
251     /// let m: &MyMessage = MyMessage::default_instance();
252     /// # }
253     /// ```
default_instance() -> &'static Self where Self: Sized254     fn default_instance() -> &'static Self
255     where
256         Self: Sized;
257 }
258 
message_down_cast<'a, M: Message + 'a>(m: &'a dyn Message) -> &'a M259 pub 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 /// Parse message from reader.
264 /// Parse stops on EOF or when error encountered.
265 #[deprecated(since = "2.19", note = "Use Message::parse_from_reader instead")]
parse_from_reader<M: Message>(reader: &mut dyn Read) -> ProtobufResult<M>266 pub fn parse_from_reader<M: Message>(reader: &mut dyn Read) -> ProtobufResult<M> {
267     M::parse_from_reader(reader)
268 }
269 
270 /// Parse message from byte array.
271 #[deprecated(since = "2.19", note = "Use Message::parse_from_bytes instead")]
parse_from_bytes<M: Message>(bytes: &[u8]) -> ProtobufResult<M>272 pub fn parse_from_bytes<M: Message>(bytes: &[u8]) -> ProtobufResult<M> {
273     M::parse_from_bytes(bytes)
274 }
275 
276 /// Parse message from `Bytes` object.
277 /// Resulting message may share references to the passed bytes object.
278 #[cfg(feature = "bytes")]
279 #[deprecated(
280     since = "2.19",
281     note = "Use Message::parse_from_carllerche_bytes instead"
282 )]
parse_from_carllerche_bytes<M: Message>(bytes: &Bytes) -> ProtobufResult<M>283 pub fn parse_from_carllerche_bytes<M: Message>(bytes: &Bytes) -> ProtobufResult<M> {
284     M::parse_from_carllerche_bytes(bytes)
285 }
286 
287 /// Parse length-delimited message from stream.
288 ///
289 /// Read varint length first, and read messages of that length then.
290 ///
291 /// This function is deprecated and will be removed in the next major release.
292 #[deprecated]
parse_length_delimited_from<M: Message>(is: &mut CodedInputStream) -> ProtobufResult<M>293 pub fn parse_length_delimited_from<M: Message>(is: &mut CodedInputStream) -> ProtobufResult<M> {
294     is.read_message::<M>()
295 }
296 
297 /// Parse length-delimited message from `Read`.
298 ///
299 /// This function is deprecated and will be removed in the next major release.
300 #[deprecated]
parse_length_delimited_from_reader<M: Message>(r: &mut dyn Read) -> ProtobufResult<M>301 pub fn parse_length_delimited_from_reader<M: Message>(r: &mut dyn Read) -> ProtobufResult<M> {
302     // TODO: wrong: we may read length first, and then read exact number of bytes needed
303     r.with_coded_input_stream(|is| is.read_message::<M>())
304 }
305 
306 /// Parse length-delimited message from bytes.
307 ///
308 /// This function is deprecated and will be removed in the next major release.
309 #[deprecated]
parse_length_delimited_from_bytes<M: Message>(bytes: &[u8]) -> ProtobufResult<M>310 pub fn parse_length_delimited_from_bytes<M: Message>(bytes: &[u8]) -> ProtobufResult<M> {
311     bytes.with_coded_input_stream(|is| is.read_message::<M>())
312 }
313