protobuf/rt/
map.rs

1use crate::error::WireError;
2use crate::wire_format::WireType;
3use crate::CodedInputStream;
4
5pub(crate) fn read_map_template_new(
6    is: &mut CodedInputStream,
7    mut key: impl FnMut(WireType, &mut CodedInputStream) -> crate::Result<()>,
8    mut value: impl FnMut(WireType, &mut CodedInputStream) -> crate::Result<()>,
9) -> crate::Result<()> {
10    let len = is.read_raw_varint32()?;
11    let old_limit = is.push_limit(len as u64)?;
12    while !is.eof()? {
13        let (field_number, wire_type) = is.read_tag_unpack()?;
14        match field_number {
15            1 => key(wire_type, is)?,
16            2 => value(wire_type, is)?,
17            _ => is.skip_field(wire_type)?,
18        }
19    }
20    is.pop_limit(old_limit);
21    Ok(())
22}
23
24pub(crate) fn read_map_template(
25    wire_type: WireType,
26    is: &mut CodedInputStream,
27    key: impl FnMut(WireType, &mut CodedInputStream) -> crate::Result<()>,
28    value: impl FnMut(WireType, &mut CodedInputStream) -> crate::Result<()>,
29) -> crate::Result<()> {
30    if wire_type != WireType::LengthDelimited {
31        return Err(WireError::UnexpectedWireType(wire_type).into());
32    }
33
34    read_map_template_new(is, key, value)
35}