| //! Functions used by generated protobuf code. |
| //! Should not be used by programs written by hands. |
| |
| use std::collections::HashMap; |
| use std::default::Default; |
| use std::hash::Hash; |
| |
| #[cfg(feature = "bytes")] |
| use crate::chars::Chars; |
| #[cfg(feature = "bytes")] |
| use bytes::Bytes; |
| |
| use crate::coded_input_stream::CodedInputStream; |
| use crate::coded_output_stream::CodedOutputStream; |
| use crate::enums::ProtobufEnum; |
| use crate::error::ProtobufError; |
| use crate::error::ProtobufResult; |
| use crate::error::WireError; |
| use crate::message::*; |
| use crate::repeated::RepeatedField; |
| use crate::singular::SingularField; |
| use crate::singular::SingularPtrField; |
| use crate::types::*; |
| use crate::zigzag::*; |
| |
| pub use crate::lazy_v2::LazyV2; |
| use crate::unknown::UnknownFields; |
| use crate::wire_format; |
| use crate::wire_format::WireType; |
| |
| /// Given `u64` value compute varint encoded length. |
| pub fn compute_raw_varint64_size(value: u64) -> u32 { |
| if (value & (0xffffffffffffffffu64 << 7)) == 0 { |
| return 1; |
| } |
| if (value & (0xffffffffffffffffu64 << 14)) == 0 { |
| return 2; |
| } |
| if (value & (0xffffffffffffffffu64 << 21)) == 0 { |
| return 3; |
| } |
| if (value & (0xffffffffffffffffu64 << 28)) == 0 { |
| return 4; |
| } |
| if (value & (0xffffffffffffffffu64 << 35)) == 0 { |
| return 5; |
| } |
| if (value & (0xffffffffffffffffu64 << 42)) == 0 { |
| return 6; |
| } |
| if (value & (0xffffffffffffffffu64 << 49)) == 0 { |
| return 7; |
| } |
| if (value & (0xffffffffffffffffu64 << 56)) == 0 { |
| return 8; |
| } |
| if (value & (0xffffffffffffffffu64 << 63)) == 0 { |
| return 9; |
| } |
| 10 |
| } |
| |
| /// Given `u32` value compute varint encoded length. |
| pub fn compute_raw_varint32_size(value: u32) -> u32 { |
| compute_raw_varint64_size(value as u64) |
| } |
| |
| /// Helper trait implemented by integer types which could be encoded as varint. |
| pub trait ProtobufVarint { |
| /// Size of self when encoded as varint. |
| fn len_varint(&self) -> u32; |
| } |
| |
| /// Helper trait implemented by integer types which could be encoded as zigzag varint. |
| pub trait ProtobufVarintZigzag { |
| /// Size of self when encoded as zigzag varint. |
| fn len_varint_zigzag(&self) -> u32; |
| } |
| |
| impl ProtobufVarint for u64 { |
| fn len_varint(&self) -> u32 { |
| compute_raw_varint64_size(*self) |
| } |
| } |
| |
| impl ProtobufVarint for u32 { |
| fn len_varint(&self) -> u32 { |
| (*self as u64).len_varint() |
| } |
| } |
| |
| impl ProtobufVarint for i64 { |
| fn len_varint(&self) -> u32 { |
| // same as length of u64 |
| (*self as u64).len_varint() |
| } |
| } |
| |
| impl ProtobufVarintZigzag for i64 { |
| fn len_varint_zigzag(&self) -> u32 { |
| compute_raw_varint64_size(encode_zig_zag_64(*self)) |
| } |
| } |
| |
| impl ProtobufVarint for i32 { |
| fn len_varint(&self) -> u32 { |
| // sign-extend and then compute |
| (*self as i64).len_varint() |
| } |
| } |
| |
| impl ProtobufVarintZigzag for i32 { |
| fn len_varint_zigzag(&self) -> u32 { |
| compute_raw_varint32_size(encode_zig_zag_32(*self)) |
| } |
| } |
| |
| impl ProtobufVarint for bool { |
| fn len_varint(&self) -> u32 { |
| 1 |
| } |
| } |
| |
| /* Commented out due to https://github.com/mozilla/rust/issues/8075 |
| impl<E:ProtobufEnum> ProtobufVarint for E { |
| fn len_varint(&self) -> u32 { |
| self.value().len_varint() |
| } |
| } |
| */ |
| |
| /// Size of serialized repeated packed field, excluding length and tag. |
| pub fn vec_packed_varint_data_size<T: ProtobufVarint>(vec: &[T]) -> u32 { |
| vec.iter().map(|v| v.len_varint()).fold(0, |a, i| a + i) |
| } |
| |
| /// Size of serialized repeated packed field, excluding length and tag. |
| pub fn vec_packed_varint_zigzag_data_size<T: ProtobufVarintZigzag>(vec: &[T]) -> u32 { |
| vec.iter() |
| .map(|v| v.len_varint_zigzag()) |
| .fold(0, |a, i| a + i) |
| } |
| |
| /// Size of serialized repeated packed enum field, excluding length and tag. |
| pub fn vec_packed_enum_data_size<E: ProtobufEnum>(vec: &[E]) -> u32 { |
| vec.iter() |
| .map(|e| compute_raw_varint32_size(e.value() as u32)) |
| .fold(0, |a, i| a + i) |
| } |
| |
| /// Size of serialized data with length prefix and tag |
| pub fn vec_packed_varint_size<T: ProtobufVarint>(field_number: u32, vec: &[T]) -> u32 { |
| if vec.is_empty() { |
| 0 |
| } else { |
| let data_size = vec_packed_varint_data_size(vec); |
| tag_size(field_number) + data_size.len_varint() + data_size |
| } |
| } |
| |
| /// Size of serialized data with length prefix and tag |
| pub fn vec_packed_varint_zigzag_size<T: ProtobufVarintZigzag>(field_number: u32, vec: &[T]) -> u32 { |
| if vec.is_empty() { |
| 0 |
| } else { |
| let data_size = vec_packed_varint_zigzag_data_size(vec); |
| tag_size(field_number) + data_size.len_varint() + data_size |
| } |
| } |
| |
| /// Size of serialized data with length prefix and tag |
| pub fn vec_packed_enum_size<E: ProtobufEnum>(field_number: u32, vec: &[E]) -> u32 { |
| if vec.is_empty() { |
| 0 |
| } else { |
| let data_size = vec_packed_enum_data_size(vec); |
| tag_size(field_number) + data_size.len_varint() + data_size |
| } |
| } |
| |
| /// Compute tag size. Size of tag does not depend on wire type. |
| pub fn tag_size(field_number: u32) -> u32 { |
| wire_format::Tag::make(field_number, WireType::WireTypeFixed64) |
| .value() |
| .len_varint() |
| } |
| |
| fn value_size_no_tag<T: ProtobufVarint>(value: T, wt: WireType) -> u32 { |
| match wt { |
| WireType::WireTypeFixed64 => 8, |
| WireType::WireTypeFixed32 => 4, |
| WireType::WireTypeVarint => value.len_varint(), |
| _ => panic!(), |
| } |
| } |
| |
| /// Integer value size when encoded as specified wire type. |
| pub fn value_size<T: ProtobufVarint>(field_number: u32, value: T, wt: WireType) -> u32 { |
| tag_size(field_number) + value_size_no_tag(value, wt) |
| } |
| |
| /// Integer value size when encoded as specified wire type. |
| pub fn value_varint_zigzag_size_no_tag<T: ProtobufVarintZigzag>(value: T) -> u32 { |
| value.len_varint_zigzag() |
| } |
| |
| /// Length of value when encoding with zigzag encoding with tag |
| pub fn value_varint_zigzag_size<T: ProtobufVarintZigzag>(field_number: u32, value: T) -> u32 { |
| tag_size(field_number) + value_varint_zigzag_size_no_tag(value) |
| } |
| |
| fn enum_size_no_tag<E: ProtobufEnum>(value: E) -> u32 { |
| value.value().len_varint() |
| } |
| |
| /// Size of encoded enum field value. |
| pub fn enum_size<E: ProtobufEnum>(field_number: u32, value: E) -> u32 { |
| tag_size(field_number) + enum_size_no_tag(value) |
| } |
| |
| fn bytes_size_no_tag(bytes: &[u8]) -> u32 { |
| compute_raw_varint64_size(bytes.len() as u64) + bytes.len() as u32 |
| } |
| |
| /// Size of encoded bytes field. |
| pub fn bytes_size(field_number: u32, bytes: &[u8]) -> u32 { |
| tag_size(field_number) + bytes_size_no_tag(bytes) |
| } |
| |
| fn string_size_no_tag(s: &str) -> u32 { |
| bytes_size_no_tag(s.as_bytes()) |
| } |
| |
| /// Size of encoded string field. |
| pub fn string_size(field_number: u32, s: &str) -> u32 { |
| tag_size(field_number) + string_size_no_tag(s) |
| } |
| |
| /// Size of encoded unknown fields size. |
| pub fn unknown_fields_size(unknown_fields: &UnknownFields) -> u32 { |
| let mut r = 0; |
| for (number, values) in unknown_fields { |
| r += (tag_size(number) + 4) * values.fixed32.len() as u32; |
| r += (tag_size(number) + 8) * values.fixed64.len() as u32; |
| |
| r += tag_size(number) * values.varint.len() as u32; |
| for varint in &values.varint { |
| r += varint.len_varint(); |
| } |
| |
| r += tag_size(number) * values.length_delimited.len() as u32; |
| for bytes in &values.length_delimited { |
| r += bytes_size_no_tag(&bytes); |
| } |
| } |
| r |
| } |
| |
| /// Read repeated `int32` field into given vec. |
| pub fn read_repeated_int32_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<i32>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_int32_into(target), |
| WireType::WireTypeVarint => { |
| target.push(is.read_int32()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `int64` field into given vec. |
| pub fn read_repeated_int64_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<i64>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_int64_into(target), |
| WireType::WireTypeVarint => { |
| target.push(is.read_int64()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `uint32` field into given vec. |
| pub fn read_repeated_uint32_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<u32>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_uint32_into(target), |
| WireType::WireTypeVarint => { |
| target.push(is.read_uint32()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `uint64` field into given vec. |
| pub fn read_repeated_uint64_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<u64>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_uint64_into(target), |
| WireType::WireTypeVarint => { |
| target.push(is.read_uint64()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `sint32` field into given vec. |
| pub fn read_repeated_sint32_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<i32>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_sint32_into(target), |
| WireType::WireTypeVarint => { |
| target.push(is.read_sint32()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `sint64` field into given vec. |
| pub fn read_repeated_sint64_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<i64>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_sint64_into(target), |
| WireType::WireTypeVarint => { |
| target.push(is.read_sint64()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `fixed32` field into given vec. |
| pub fn read_repeated_fixed32_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<u32>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_fixed32_into(target), |
| WireType::WireTypeFixed32 => { |
| target.push(is.read_fixed32()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `fixed64` field into given vec. |
| pub fn read_repeated_fixed64_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<u64>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_fixed64_into(target), |
| WireType::WireTypeFixed64 => { |
| target.push(is.read_fixed64()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `sfixed32` field into given vec. |
| pub fn read_repeated_sfixed32_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<i32>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_sfixed32_into(target), |
| WireType::WireTypeFixed32 => { |
| target.push(is.read_sfixed32()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `sfixed64` field into given vec. |
| pub fn read_repeated_sfixed64_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<i64>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_sfixed64_into(target), |
| WireType::WireTypeFixed64 => { |
| target.push(is.read_sfixed64()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `double` field into given vec. |
| pub fn read_repeated_double_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<f64>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_double_into(target), |
| WireType::WireTypeFixed64 => { |
| target.push(is.read_double()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `float` field into given vec. |
| pub fn read_repeated_float_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<f32>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_float_into(target), |
| WireType::WireTypeFixed32 => { |
| target.push(is.read_float()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `bool` field into given vec. |
| pub fn read_repeated_bool_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<bool>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_bool_into(target), |
| WireType::WireTypeVarint => { |
| target.push(is.read_bool()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `enum` field into given vec. |
| /// This function is no longer called from generated code, remove in 1.5. |
| pub fn read_repeated_enum_into<E: ProtobufEnum>( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<E>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_repeated_packed_enum_into(target), |
| WireType::WireTypeVarint => { |
| target.push(is.read_enum()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Helper function to read single enum value. |
| #[inline] |
| fn read_enum_with_unknown_fields_into<E: ProtobufEnum, C>( |
| is: &mut CodedInputStream, |
| target: C, |
| field_number: u32, |
| unknown_fields: &mut UnknownFields, |
| ) -> ProtobufResult<()> |
| where |
| C: FnOnce(E), |
| { |
| let i = is.read_int32()?; |
| match ProtobufEnum::from_i32(i) { |
| Some(e) => target(e), |
| None => unknown_fields.add_varint(field_number, i as i64 as u64), |
| } |
| Ok(()) |
| } |
| |
| fn read_repeated_packed_enum_with_unknown_fields_into<E: ProtobufEnum>( |
| is: &mut CodedInputStream, |
| target: &mut Vec<E>, |
| field_number: u32, |
| unknown_fields: &mut UnknownFields, |
| ) -> ProtobufResult<()> { |
| let len = is.read_raw_varint64()?; |
| let old_limit = is.push_limit(len)?; |
| while !is.eof()? { |
| read_enum_with_unknown_fields_into(is, |e| target.push(e), field_number, unknown_fields)?; |
| } |
| is.pop_limit(old_limit); |
| Ok(()) |
| } |
| |
| /// Read repeated `enum` field into given vec, |
| /// and when value is unknown store it in unknown fields |
| /// which matches proto2 spec. |
| /// |
| /// See explanation |
| /// [here](https://github.com/stepancheg/rust-protobuf/issues/233#issuecomment-375142710) |
| pub fn read_repeated_enum_with_unknown_fields_into<E: ProtobufEnum>( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<E>, |
| field_number: u32, |
| unknown_fields: &mut UnknownFields, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => read_repeated_packed_enum_with_unknown_fields_into( |
| is, |
| target, |
| field_number, |
| unknown_fields, |
| ), |
| WireType::WireTypeVarint => { |
| read_enum_with_unknown_fields_into(is, |e| target.push(e), field_number, unknown_fields) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `enum` field into given vec, |
| /// and when value is unknown store it in unknown fields |
| /// which matches proto2 spec. |
| /// |
| /// See explanation |
| /// [here](https://github.com/stepancheg/rust-protobuf/issues/233#issuecomment-375142710) |
| pub fn read_proto3_enum_with_unknown_fields_into<E: ProtobufEnum>( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut E, |
| field_number: u32, |
| unknown_fields: &mut UnknownFields, |
| ) -> ProtobufResult<()> { |
| if wire_type != WireType::WireTypeVarint { |
| return Err(unexpected_wire_type(wire_type)); |
| } |
| |
| read_enum_with_unknown_fields_into(is, |e| *target = e, field_number, unknown_fields) |
| } |
| |
| /// Read repeated `enum` field into given vec, |
| /// and when value is unknown store it in unknown fields |
| /// which matches proto2 spec. |
| /// |
| /// See explanation |
| /// [here](https://github.com/stepancheg/rust-protobuf/issues/233#issuecomment-375142710) |
| pub fn read_proto2_enum_with_unknown_fields_into<E: ProtobufEnum>( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Option<E>, |
| field_number: u32, |
| unknown_fields: &mut UnknownFields, |
| ) -> ProtobufResult<()> { |
| if wire_type != WireType::WireTypeVarint { |
| return Err(unexpected_wire_type(wire_type)); |
| } |
| |
| read_enum_with_unknown_fields_into(is, |e| *target = Some(e), field_number, unknown_fields) |
| } |
| |
| /// Read repeated `string` field into given vec. |
| pub fn read_repeated_string_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut RepeatedField<String>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| let tmp = target.push_default(); |
| is.read_string_into(tmp) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `Chars` field into given vec. |
| #[cfg(feature = "bytes")] |
| pub fn read_repeated_carllerche_string_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<Chars>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| target.push(is.read_carllerche_chars()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `string` field. |
| pub fn read_singular_string_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut SingularField<String>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| let tmp = target.set_default(); |
| is.read_string_into(tmp) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `Chars` field. |
| #[cfg(feature = "bytes")] |
| pub fn read_singular_carllerche_string_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Option<Chars>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| *target = Some(is.read_carllerche_chars()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `string` field for proto3. |
| pub fn read_singular_proto3_string_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut String, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_string_into(target), |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `Chars` field for proto3. |
| #[cfg(feature = "bytes")] |
| pub fn read_singular_proto3_carllerche_string_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Chars, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| *target = is.read_carllerche_chars()?; |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `bytes` field into given vec. |
| pub fn read_repeated_bytes_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut RepeatedField<Vec<u8>>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| let tmp = target.push_default(); |
| is.read_bytes_into(tmp) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `Bytes` field into given vec. |
| #[cfg(feature = "bytes")] |
| pub fn read_repeated_carllerche_bytes_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<Bytes>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| target.push(is.read_carllerche_bytes()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `bytes` field. |
| pub fn read_singular_bytes_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut SingularField<Vec<u8>>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| let tmp = target.set_default(); |
| is.read_bytes_into(tmp) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `Bytes` field. |
| #[cfg(feature = "bytes")] |
| pub fn read_singular_carllerche_bytes_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Option<Bytes>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| *target = Some(is.read_carllerche_bytes()?); |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `bytes` field for proto3. |
| pub fn read_singular_proto3_bytes_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Vec<u8>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => is.read_bytes_into(target), |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `Bytes` field for proto3. |
| #[cfg(feature = "bytes")] |
| pub fn read_singular_proto3_carllerche_bytes_into( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut Bytes, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| *target = is.read_carllerche_bytes()?; |
| Ok(()) |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read repeated `message` field. |
| pub fn read_repeated_message_into<M: Message + Default>( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut RepeatedField<M>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| is.incr_recursion()?; |
| let tmp = target.push_default(); |
| let res = is.merge_message(tmp); |
| is.decr_recursion(); |
| res |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| /// Read singular `message` field. |
| pub fn read_singular_message_into<M: Message + Default>( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut SingularPtrField<M>, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| WireType::WireTypeLengthDelimited => { |
| is.incr_recursion()?; |
| let tmp = target.set_default(); |
| let res = is.merge_message(tmp); |
| is.decr_recursion(); |
| res |
| } |
| _ => Err(unexpected_wire_type(wire_type)), |
| } |
| } |
| |
| fn skip_group(is: &mut CodedInputStream) -> ProtobufResult<()> { |
| loop { |
| let (_, wire_type) = is.read_tag_unpack()?; |
| if wire_type == wire_format::WireTypeEndGroup { |
| return Ok(()); |
| } |
| is.skip_field(wire_type)?; |
| } |
| } |
| |
| /// Handle unknown field in generated code. |
| /// Either store a value in unknown, or skip a group. |
| pub fn read_unknown_or_skip_group( |
| field_number: u32, |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| unknown_fields: &mut UnknownFields, |
| ) -> ProtobufResult<()> { |
| match wire_type { |
| wire_format::WireTypeStartGroup => skip_group(is), |
| _ => { |
| let unknown = is.read_unknown(wire_type)?; |
| unknown_fields.add_value(field_number, unknown); |
| Ok(()) |
| } |
| } |
| } |
| |
| /// Create an error for unexpected wire type. |
| /// |
| /// Function is used in generated code, so error types can be changed, |
| /// but this function remains unchanged. |
| pub fn unexpected_wire_type(wire_type: WireType) -> ProtobufError { |
| ProtobufError::WireError(WireError::UnexpectedWireType(wire_type)) |
| } |
| |
| /// Compute serialized size of `map` field and cache nested field sizes. |
| pub fn compute_map_size<K, V>(field_number: u32, map: &HashMap<K::Value, V::Value>) -> u32 |
| where |
| K: ProtobufType, |
| V: ProtobufType, |
| K::Value: Eq + Hash, |
| { |
| let mut sum = 0; |
| for (k, v) in map { |
| let key_tag_size = 1; |
| let value_tag_size = 1; |
| |
| let key_len = K::compute_size_with_length_delimiter(k); |
| let value_len = V::compute_size_with_length_delimiter(v); |
| |
| let entry_len = key_tag_size + key_len + value_tag_size + value_len; |
| sum += tag_size(field_number) + compute_raw_varint32_size(entry_len) + entry_len; |
| } |
| sum |
| } |
| |
| /// Write map, message sizes must be already known. |
| pub fn write_map_with_cached_sizes<K, V>( |
| field_number: u32, |
| map: &HashMap<K::Value, V::Value>, |
| os: &mut CodedOutputStream, |
| ) -> ProtobufResult<()> |
| where |
| K: ProtobufType, |
| V: ProtobufType, |
| K::Value: Eq + Hash, |
| { |
| for (k, v) in map { |
| let key_tag_size = 1; |
| let value_tag_size = 1; |
| |
| let key_len = K::get_cached_size_with_length_delimiter(k); |
| let value_len = V::get_cached_size_with_length_delimiter(v); |
| |
| let entry_len = key_tag_size + key_len + value_tag_size + value_len; |
| |
| os.write_tag(field_number, WireType::WireTypeLengthDelimited)?; |
| os.write_raw_varint32(entry_len)?; |
| K::write_with_cached_size(1, k, os)?; |
| V::write_with_cached_size(2, v, os)?; |
| } |
| Ok(()) |
| } |
| |
| /// Read `map` field. |
| pub fn read_map_into<K, V>( |
| wire_type: WireType, |
| is: &mut CodedInputStream, |
| target: &mut HashMap<K::Value, V::Value>, |
| ) -> ProtobufResult<()> |
| where |
| K: ProtobufType, |
| V: ProtobufType, |
| K::Value: Eq + Hash + Default, |
| V::Value: Default, |
| { |
| if wire_type != WireType::WireTypeLengthDelimited { |
| return Err(unexpected_wire_type(wire_type)); |
| } |
| |
| let mut key = Default::default(); |
| let mut value = Default::default(); |
| |
| let len = is.read_raw_varint32()?; |
| let old_limit = is.push_limit(len as u64)?; |
| while !is.eof()? { |
| let (field_number, wire_type) = is.read_tag_unpack()?; |
| match field_number { |
| 1 => { |
| if wire_type != K::wire_type() { |
| return Err(unexpected_wire_type(wire_type)); |
| } |
| key = K::read(is)?; |
| } |
| 2 => { |
| if wire_type != V::wire_type() { |
| return Err(unexpected_wire_type(wire_type)); |
| } |
| value = V::read(is)?; |
| } |
| _ => is.skip_field(wire_type)?, |
| } |
| } |
| is.pop_limit(old_limit); |
| |
| target.insert(key, value); |
| |
| Ok(()) |
| } |