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
20/// Size of encoded unknown fields size.
21pub 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
35/// Handle unknown field in generated code.
36/// Either store a value in unknown, or skip a group.
37pub(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
53/// Handle unknown field in generated code.
54/// Either store a value in unknown, or skip a group.
55/// Return error if tag is incorrect.
56pub 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
65/// Skip field.
66pub 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}