protobuf/rt/
unknown_or_group.rs
1use crate::rt::compute_raw_varint64_size;
2use crate::rt::singular::bytes_size_no_tag;
3use crate::rt::tag_size;
4use crate::wire_format::Tag;
5use crate::wire_format::WireType;
6use crate::CodedInputStream;
7use crate::UnknownFields;
8use crate::UnknownValueRef;
9
10fn skip_group(is: &mut CodedInputStream) -> crate::Result<()> {
11 loop {
12 let (_, wire_type) = is.read_tag_unpack()?;
13 if wire_type == WireType::EndGroup {
14 return Ok(());
15 }
16 is.skip_field(wire_type)?;
17 }
18}
19
20pub fn unknown_fields_size(unknown_fields: &UnknownFields) -> u64 {
22 let mut r = 0;
23 for (number, value) in unknown_fields {
24 r += tag_size(number);
25 r += match value {
26 UnknownValueRef::Fixed32(_) => 4,
27 UnknownValueRef::Fixed64(_) => 8,
28 UnknownValueRef::Varint(v) => compute_raw_varint64_size(v),
29 UnknownValueRef::LengthDelimited(v) => bytes_size_no_tag(v),
30 };
31 }
32 r
33}
34
35pub(crate) fn read_unknown_or_skip_group_with_tag_unpacked(
38 field_number: u32,
39 wire_type: WireType,
40 is: &mut CodedInputStream,
41 unknown_fields: &mut UnknownFields,
42) -> crate::Result<()> {
43 match wire_type {
44 WireType::StartGroup => skip_group(is),
45 _ => {
46 let unknown = is.read_unknown(wire_type)?;
47 unknown_fields.add_value(field_number, unknown);
48 Ok(())
49 }
50 }
51}
52
53pub fn read_unknown_or_skip_group(
57 tag: u32,
58 is: &mut CodedInputStream,
59 unknown_fields: &mut UnknownFields,
60) -> crate::Result<()> {
61 let (field_humber, wire_type) = Tag::new(tag)?.unpack();
62 read_unknown_or_skip_group_with_tag_unpacked(field_humber, wire_type, is, unknown_fields)
63}
64
65pub fn skip_field_for_tag(tag: u32, is: &mut CodedInputStream) -> crate::Result<()> {
67 let (_field_humber, wire_type) = Tag::new(tag)?.unpack();
68 is.skip_field(wire_type)
69}