1use std::borrow::Cow;
5
6use buffa::{
7 DecodeError, EncodeError,
8 bytes::{Buf, BufMut, Bytes, BytesMut},
9};
10
11use crate::{
12 dynamic::{
13 fields::{DynamicMessageFieldSet, ValueOrUnknown},
14 message_codec, message_decode,
15 unknown::UnknownFieldSet,
16 value::{SetFieldError, Value},
17 },
18 field::FieldDescriptor,
19 message::MessageDescriptor,
20 pool::DescriptorPool,
21};
22
23#[derive(Clone, Debug)]
30pub struct DynamicMessage {
31 pub(crate) desc: MessageDescriptor,
32 pub(crate) fields: DynamicMessageFieldSet,
33}
34
35impl PartialEq for DynamicMessage {
36 fn eq(&self, other: &Self) -> bool {
37 self.desc == other.desc && self.fields == other.fields
38 }
39}
40
41impl DynamicMessage {
42 #[must_use]
44 pub fn new(desc: MessageDescriptor) -> Self {
45 Self {
46 desc,
47 fields: DynamicMessageFieldSet::default(),
48 }
49 }
50
51 #[must_use]
53 pub fn descriptor(&self) -> MessageDescriptor {
54 self.desc.clone()
55 }
56
57 #[must_use]
59 pub fn parent_pool(&self) -> DescriptorPool {
60 self.desc.pool.clone()
61 }
62
63 #[must_use]
65 pub fn is_empty(&self) -> bool {
66 self.fields.is_empty()
67 }
68
69 pub fn decode<B: Buf>(desc: MessageDescriptor, mut buf: B) -> Result<Self, DecodeError> {
77 let mut msg = Self::new(desc);
78 message_decode::merge(&mut msg, &mut buf, buffa::RECURSION_LIMIT)?;
79 Ok(msg)
80 }
81
82 pub fn decode_with_options<B: Buf>(
87 desc: MessageDescriptor,
88 mut buf: B,
89 opts: buffa::DecodeOptions,
90 ) -> Result<Self, DecodeError> {
91 if buf.remaining() > opts.max_message_size() {
92 return Err(DecodeError::MessageTooLarge);
93 }
94 let mut msg = Self::new(desc);
95 message_decode::merge(&mut msg, &mut buf, opts.recursion_limit())?;
96 Ok(msg)
97 }
98
99 pub fn merge<B: Buf>(&mut self, mut buf: B) -> Result<(), DecodeError> {
105 message_decode::merge(self, &mut buf, buffa::RECURSION_LIMIT)
106 }
107
108 #[must_use]
112 pub fn encoded_len(&self) -> usize {
113 message_codec::encoded_len(self)
114 }
115
116 pub fn encode<B: BufMut>(&self, buf: &mut B) -> Result<(), EncodeError> {
124 message_codec::encode(self, buf)
125 }
126
127 #[must_use]
129 pub fn encode_to_vec(&self) -> Vec<u8> {
130 let mut buf = Vec::with_capacity(self.encoded_len());
131 let _ = self.encode(&mut buf);
133 buf
134 }
135
136 #[must_use]
138 pub fn encode_to_bytes(&self) -> Bytes {
139 let mut buf = BytesMut::with_capacity(self.encoded_len());
140 let _ = self.encode(&mut buf);
141 buf.freeze()
142 }
143
144 pub fn transcode_from<T: buffa::Message>(&mut self, value: &T) -> Result<(), DecodeError> {
152 self.merge(value.encode_to_vec().as_slice())
153 }
154
155 pub fn transcode_to<T: buffa::Message + Default>(&self) -> Result<T, DecodeError> {
161 T::decode_from_slice(self.encode_to_vec().as_slice())
162 }
163
164 #[must_use]
167 pub fn transcode_to_dynamic(&self) -> Self {
168 self.clone()
169 }
170
171 pub fn fields(&self) -> impl Iterator<Item = (FieldDescriptor, &Value)> + '_ {
175 let desc = self.desc.clone();
176 self.fields
177 .iter_known()
178 .filter_map(move |(n, v)| desc.get_field_by_number(n).map(|fd| (fd, v)))
179 }
180
181 pub fn iter_with_options<'a>(
185 &'a self,
186 include_default: bool,
187 index_order: bool,
188 ) -> Box<dyn Iterator<Item = (FieldDescriptor, Cow<'a, Value>)> + 'a> {
189 if index_order {
190 Box::new(self.iter_index_order(include_default))
191 } else {
192 Box::new(self.iter_number_order(include_default))
193 }
194 }
195
196 fn iter_number_order<'a>(
197 &'a self,
198 include_default: bool,
199 ) -> impl Iterator<Item = (FieldDescriptor, Cow<'a, Value>)> + 'a {
200 let descriptors = collect_descriptors_in_number_order(&self.desc, include_default);
201 descriptors
202 .into_iter()
203 .filter_map(move |fd| match self.fields.get_value(fd.number()) {
204 Some(v) => Some((fd, Cow::Borrowed(v))),
205 None if include_default => {
206 let v = Value::default_value_for_field(&fd);
207 Some((fd, Cow::Owned(v)))
208 }
209 None => None,
210 })
211 }
212
213 fn iter_index_order<'a>(
214 &'a self,
215 include_default: bool,
216 ) -> impl Iterator<Item = (FieldDescriptor, Cow<'a, Value>)> + 'a {
217 self.desc
218 .fields()
219 .filter_map(move |fd| match self.fields.get_value(fd.number()) {
220 Some(v) => Some((fd, Cow::Borrowed(v))),
221 None if include_default => {
222 let v = Value::default_value_for_field(&fd);
223 Some((fd, Cow::Owned(v)))
224 }
225 None => None,
226 })
227 }
228
229 #[must_use]
232 pub fn has_field(&self, field: &FieldDescriptor) -> bool {
233 match self.fields.get_value(field.number()) {
234 Some(v) => field.supports_presence() || !v.is_default(&field.kind()),
235 None => false,
236 }
237 }
238
239 #[must_use]
242 pub fn get_field(&self, field: &FieldDescriptor) -> Cow<'_, Value> {
243 match self.fields.get_value(field.number()) {
244 Some(v) => Cow::Borrowed(v),
245 None => Cow::Owned(Value::default_value_for_field(field)),
246 }
247 }
248
249 pub fn get_field_mut(&mut self, field: &FieldDescriptor) -> &mut Value {
252 if !self.fields.has_value(field.number()) {
253 let default = Value::default_value_for_field(field);
254 self.fields.set(field, default);
255 } else if let Some(oneof) = field.containing_oneof() {
256 let self_number = field.number();
257 for sibling in oneof.fields() {
258 if sibling.number() != self_number {
259 self.fields.fields.remove(&sibling.number());
260 }
261 }
262 }
263 self.fields
264 .get_value_mut(field.number())
265 .expect("just-inserted value")
266 }
267
268 #[must_use]
270 pub fn has_field_by_name(&self, name: &str) -> bool {
271 match self.desc.get_field_by_name(name) {
272 Some(fd) => self.has_field(&fd),
273 None => false,
274 }
275 }
276
277 #[must_use]
279 pub fn get_field_by_name(&self, name: &str) -> Option<Cow<'_, Value>> {
280 self.desc
281 .get_field_by_name(name)
282 .map(|fd| self.get_field(&fd))
283 }
284
285 pub fn get_field_by_name_mut(&mut self, name: &str) -> Option<&mut Value> {
287 let fd = self.desc.get_field_by_name(name)?;
288 Some(self.get_field_mut(&fd))
289 }
290
291 #[must_use]
293 pub fn has_field_by_number(&self, number: u32) -> bool {
294 match self.desc.get_field_by_number(number) {
295 Some(fd) => self.has_field(&fd),
296 None => false,
297 }
298 }
299
300 #[must_use]
302 pub fn get_field_by_number(&self, number: u32) -> Option<Cow<'_, Value>> {
303 self.desc
304 .get_field_by_number(number)
305 .map(|fd| self.get_field(&fd))
306 }
307
308 pub fn get_field_by_number_mut(&mut self, number: u32) -> Option<&mut Value> {
310 let fd = self.desc.get_field_by_number(number)?;
311 Some(self.get_field_mut(&fd))
312 }
313
314 pub fn set_field(&mut self, field: &FieldDescriptor, value: Value) {
326 self.fields.set(field, value);
327 }
328
329 pub fn try_set_field(
337 &mut self,
338 field: &FieldDescriptor,
339 value: Value,
340 ) -> Result<(), SetFieldError> {
341 self.fields.try_set(field, value)
342 }
343
344 pub fn set_field_by_number(&mut self, number: u32, value: Value) {
351 let fd = self
352 .desc
353 .get_field_by_number(number)
354 .expect("set_field_by_number: unknown field number");
355 self.fields.set(&fd, value);
356 }
357
358 pub fn try_set_field_by_number(
364 &mut self,
365 number: u32,
366 value: Value,
367 ) -> Result<(), SetFieldError> {
368 let fd = self
369 .desc
370 .get_field_by_number(number)
371 .ok_or(SetFieldError::NotFound)?;
372 self.fields.try_set(&fd, value)
373 }
374
375 pub fn set_field_by_name(&mut self, name: &str, value: Value) {
382 let fd = self
383 .desc
384 .get_field_by_name(name)
385 .expect("set_field_by_name: unknown field name");
386 self.fields.set(&fd, value);
387 }
388
389 pub fn try_set_field_by_name(&mut self, name: &str, value: Value) -> Result<(), SetFieldError> {
395 let fd = self
396 .desc
397 .get_field_by_name(name)
398 .ok_or(SetFieldError::NotFound)?;
399 self.fields.try_set(&fd, value)
400 }
401
402 pub fn clear_field(&mut self, field: &FieldDescriptor) {
404 self.fields.clear(field);
405 }
406
407 pub fn clear_field_by_name(&mut self, name: &str) {
409 if let Some(fd) = self.desc.get_field_by_name(name) {
410 self.fields.clear(&fd);
411 }
412 }
413
414 pub fn clear_field_by_number(&mut self, number: u32) {
416 if let Some(fd) = self.desc.get_field_by_number(number) {
417 self.fields.clear(&fd);
418 }
419 }
420
421 pub fn unknown_fields(&self) -> impl Iterator<Item = (u32, &UnknownFieldSet)> + '_ {
423 self.fields.iter_unknown()
424 }
425
426 pub fn drain_unknown_fields(&mut self) -> impl Iterator<Item = (u32, UnknownFieldSet)> {
429 self.fields.drain_unknown().into_iter()
430 }
431
432 pub(crate) fn fields_set_ref(&self) -> &DynamicMessageFieldSet {
433 &self.fields
434 }
435
436 pub(crate) fn fields_set_mut(&mut self) -> &mut DynamicMessageFieldSet {
437 &mut self.fields
438 }
439
440 pub(crate) fn iter_storage(&self) -> impl Iterator<Item = (u32, &ValueOrUnknown)> + '_ {
443 self.fields.iter_in_order()
444 }
445}
446
447fn collect_descriptors_in_number_order(
448 desc: &MessageDescriptor,
449 _include_default: bool,
450) -> Vec<FieldDescriptor> {
451 let mut fields: Vec<FieldDescriptor> = desc.fields().collect();
452 fields.sort_by_key(|f| f.number());
453 fields
454}