summaryrefslogtreecommitdiff
path: root/vendor/prost/src
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/prost/src')
-rw-r--r--vendor/prost/src/encoding.rs1428
-rw-r--r--vendor/prost/src/encoding/length_delimiter.rs53
-rw-r--r--vendor/prost/src/encoding/varint.rs274
-rw-r--r--vendor/prost/src/encoding/wire_type.rs49
-rw-r--r--vendor/prost/src/error.rs180
-rw-r--r--vendor/prost/src/lib.rs42
-rw-r--r--vendor/prost/src/message.rs187
-rw-r--r--vendor/prost/src/name.rs34
-rw-r--r--vendor/prost/src/types.rs570
9 files changed, 0 insertions, 2817 deletions
diff --git a/vendor/prost/src/encoding.rs b/vendor/prost/src/encoding.rs
deleted file mode 100644
index 8fd7cbf0..00000000
--- a/vendor/prost/src/encoding.rs
+++ /dev/null
@@ -1,1428 +0,0 @@
-//! Utility functions and types for encoding and decoding Protobuf types.
-//!
-//! Meant to be used only from `Message` implementations.
-
-#![allow(clippy::implicit_hasher, clippy::ptr_arg)]
-
-use alloc::collections::BTreeMap;
-use alloc::format;
-use alloc::string::String;
-use alloc::vec::Vec;
-use core::mem;
-use core::str;
-
-use ::bytes::{Buf, BufMut, Bytes};
-
-use crate::DecodeError;
-use crate::Message;
-
-pub mod varint;
-pub use varint::{decode_varint, encode_varint, encoded_len_varint};
-
-pub mod length_delimiter;
-pub use length_delimiter::{
- decode_length_delimiter, encode_length_delimiter, length_delimiter_len,
-};
-
-pub mod wire_type;
-pub use wire_type::{check_wire_type, WireType};
-
-/// Additional information passed to every decode/merge function.
-///
-/// The context should be passed by value and can be freely cloned. When passing
-/// to a function which is decoding a nested object, then use `enter_recursion`.
-#[derive(Clone, Debug)]
-#[cfg_attr(feature = "no-recursion-limit", derive(Default))]
-pub struct DecodeContext {
- /// How many times we can recurse in the current decode stack before we hit
- /// the recursion limit.
- ///
- /// The recursion limit is defined by `RECURSION_LIMIT` and cannot be
- /// customized. The recursion limit can be ignored by building the Prost
- /// crate with the `no-recursion-limit` feature.
- #[cfg(not(feature = "no-recursion-limit"))]
- recurse_count: u32,
-}
-
-#[cfg(not(feature = "no-recursion-limit"))]
-impl Default for DecodeContext {
- #[inline]
- fn default() -> DecodeContext {
- DecodeContext {
- recurse_count: crate::RECURSION_LIMIT,
- }
- }
-}
-
-impl DecodeContext {
- /// Call this function before recursively decoding.
- ///
- /// There is no `exit` function since this function creates a new `DecodeContext`
- /// to be used at the next level of recursion. Continue to use the old context
- // at the previous level of recursion.
- #[cfg(not(feature = "no-recursion-limit"))]
- #[inline]
- pub(crate) fn enter_recursion(&self) -> DecodeContext {
- DecodeContext {
- recurse_count: self.recurse_count - 1,
- }
- }
-
- #[cfg(feature = "no-recursion-limit")]
- #[inline]
- pub(crate) fn enter_recursion(&self) -> DecodeContext {
- DecodeContext {}
- }
-
- /// Checks whether the recursion limit has been reached in the stack of
- /// decodes described by the `DecodeContext` at `self.ctx`.
- ///
- /// Returns `Ok<()>` if it is ok to continue recursing.
- /// Returns `Err<DecodeError>` if the recursion limit has been reached.
- #[cfg(not(feature = "no-recursion-limit"))]
- #[inline]
- pub(crate) fn limit_reached(&self) -> Result<(), DecodeError> {
- if self.recurse_count == 0 {
- Err(DecodeError::new("recursion limit reached"))
- } else {
- Ok(())
- }
- }
-
- #[cfg(feature = "no-recursion-limit")]
- #[inline]
- #[allow(clippy::unnecessary_wraps)] // needed in other features
- pub(crate) fn limit_reached(&self) -> Result<(), DecodeError> {
- Ok(())
- }
-}
-
-pub const MIN_TAG: u32 = 1;
-pub const MAX_TAG: u32 = (1 << 29) - 1;
-
-/// Encodes a Protobuf field key, which consists of a wire type designator and
-/// the field tag.
-#[inline]
-pub fn encode_key(tag: u32, wire_type: WireType, buf: &mut impl BufMut) {
- debug_assert!((MIN_TAG..=MAX_TAG).contains(&tag));
- let key = (tag << 3) | wire_type as u32;
- encode_varint(u64::from(key), buf);
-}
-
-/// Decodes a Protobuf field key, which consists of a wire type designator and
-/// the field tag.
-#[inline(always)]
-pub fn decode_key(buf: &mut impl Buf) -> Result<(u32, WireType), DecodeError> {
- let key = decode_varint(buf)?;
- if key > u64::from(u32::MAX) {
- return Err(DecodeError::new(format!("invalid key value: {}", key)));
- }
- let wire_type = WireType::try_from(key & 0x07)?;
- let tag = key as u32 >> 3;
-
- if tag < MIN_TAG {
- return Err(DecodeError::new("invalid tag value: 0"));
- }
-
- Ok((tag, wire_type))
-}
-
-/// Returns the width of an encoded Protobuf field key with the given tag.
-/// The returned width will be between 1 and 5 bytes (inclusive).
-#[inline]
-pub const fn key_len(tag: u32) -> usize {
- encoded_len_varint((tag << 3) as u64)
-}
-
-/// Helper function which abstracts reading a length delimiter prefix followed
-/// by decoding values until the length of bytes is exhausted.
-pub fn merge_loop<T, M, B>(
- value: &mut T,
- buf: &mut B,
- ctx: DecodeContext,
- mut merge: M,
-) -> Result<(), DecodeError>
-where
- M: FnMut(&mut T, &mut B, DecodeContext) -> Result<(), DecodeError>,
- B: Buf,
-{
- let len = decode_varint(buf)?;
- let remaining = buf.remaining();
- if len > remaining as u64 {
- return Err(DecodeError::new("buffer underflow"));
- }
-
- let limit = remaining - len as usize;
- while buf.remaining() > limit {
- merge(value, buf, ctx.clone())?;
- }
-
- if buf.remaining() != limit {
- return Err(DecodeError::new("delimited length exceeded"));
- }
- Ok(())
-}
-
-pub fn skip_field(
- wire_type: WireType,
- tag: u32,
- buf: &mut impl Buf,
- ctx: DecodeContext,
-) -> Result<(), DecodeError> {
- ctx.limit_reached()?;
- let len = match wire_type {
- WireType::Varint => decode_varint(buf).map(|_| 0)?,
- WireType::ThirtyTwoBit => 4,
- WireType::SixtyFourBit => 8,
- WireType::LengthDelimited => decode_varint(buf)?,
- WireType::StartGroup => loop {
- let (inner_tag, inner_wire_type) = decode_key(buf)?;
- match inner_wire_type {
- WireType::EndGroup => {
- if inner_tag != tag {
- return Err(DecodeError::new("unexpected end group tag"));
- }
- break 0;
- }
- _ => skip_field(inner_wire_type, inner_tag, buf, ctx.enter_recursion())?,
- }
- },
- WireType::EndGroup => return Err(DecodeError::new("unexpected end group tag")),
- };
-
- if len > buf.remaining() as u64 {
- return Err(DecodeError::new("buffer underflow"));
- }
-
- buf.advance(len as usize);
- Ok(())
-}
-
-/// Helper macro which emits an `encode_repeated` function for the type.
-macro_rules! encode_repeated {
- ($ty:ty) => {
- pub fn encode_repeated(tag: u32, values: &[$ty], buf: &mut impl BufMut) {
- for value in values {
- encode(tag, value, buf);
- }
- }
- };
-}
-
-/// Helper macro which emits a `merge_repeated` function for the numeric type.
-macro_rules! merge_repeated_numeric {
- ($ty:ty,
- $wire_type:expr,
- $merge:ident,
- $merge_repeated:ident) => {
- pub fn $merge_repeated(
- wire_type: WireType,
- values: &mut Vec<$ty>,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if wire_type == WireType::LengthDelimited {
- // Packed.
- merge_loop(values, buf, ctx, |values, buf, ctx| {
- let mut value = Default::default();
- $merge($wire_type, &mut value, buf, ctx)?;
- values.push(value);
- Ok(())
- })
- } else {
- // Unpacked.
- check_wire_type($wire_type, wire_type)?;
- let mut value = Default::default();
- $merge(wire_type, &mut value, buf, ctx)?;
- values.push(value);
- Ok(())
- }
- }
- };
-}
-
-/// Macro which emits a module containing a set of encoding functions for a
-/// variable width numeric type.
-macro_rules! varint {
- ($ty:ty,
- $proto_ty:ident) => (
- varint!($ty,
- $proto_ty,
- to_uint64(value) { *value as u64 },
- from_uint64(value) { value as $ty });
- );
-
- ($ty:ty,
- $proto_ty:ident,
- to_uint64($to_uint64_value:ident) $to_uint64:expr,
- from_uint64($from_uint64_value:ident) $from_uint64:expr) => (
-
- pub mod $proto_ty {
- use crate::encoding::*;
-
- pub fn encode(tag: u32, $to_uint64_value: &$ty, buf: &mut impl BufMut) {
- encode_key(tag, WireType::Varint, buf);
- encode_varint($to_uint64, buf);
- }
-
- pub fn merge(wire_type: WireType, value: &mut $ty, buf: &mut impl Buf, _ctx: DecodeContext) -> Result<(), DecodeError> {
- check_wire_type(WireType::Varint, wire_type)?;
- let $from_uint64_value = decode_varint(buf)?;
- *value = $from_uint64;
- Ok(())
- }
-
- encode_repeated!($ty);
-
- pub fn encode_packed(tag: u32, values: &[$ty], buf: &mut impl BufMut) {
- if values.is_empty() { return; }
-
- encode_key(tag, WireType::LengthDelimited, buf);
- let len: usize = values.iter().map(|$to_uint64_value| {
- encoded_len_varint($to_uint64)
- }).sum();
- encode_varint(len as u64, buf);
-
- for $to_uint64_value in values {
- encode_varint($to_uint64, buf);
- }
- }
-
- merge_repeated_numeric!($ty, WireType::Varint, merge, merge_repeated);
-
- #[inline]
- pub fn encoded_len(tag: u32, $to_uint64_value: &$ty) -> usize {
- key_len(tag) + encoded_len_varint($to_uint64)
- }
-
- #[inline]
- pub fn encoded_len_repeated(tag: u32, values: &[$ty]) -> usize {
- key_len(tag) * values.len() + values.iter().map(|$to_uint64_value| {
- encoded_len_varint($to_uint64)
- }).sum::<usize>()
- }
-
- #[inline]
- pub fn encoded_len_packed(tag: u32, values: &[$ty]) -> usize {
- if values.is_empty() {
- 0
- } else {
- let len = values.iter()
- .map(|$to_uint64_value| encoded_len_varint($to_uint64))
- .sum::<usize>();
- key_len(tag) + encoded_len_varint(len as u64) + len
- }
- }
-
- #[cfg(test)]
- mod test {
- use proptest::prelude::*;
-
- use crate::encoding::$proto_ty::*;
- use crate::encoding::test::{
- check_collection_type,
- check_type,
- };
-
- proptest! {
- #[test]
- fn check(value: $ty, tag in MIN_TAG..=MAX_TAG) {
- check_type(value, tag, WireType::Varint,
- encode, merge, encoded_len)?;
- }
- #[test]
- fn check_repeated(value: Vec<$ty>, tag in MIN_TAG..=MAX_TAG) {
- check_collection_type(value, tag, WireType::Varint,
- encode_repeated, merge_repeated,
- encoded_len_repeated)?;
- }
- #[test]
- fn check_packed(value: Vec<$ty>, tag in MIN_TAG..=MAX_TAG) {
- check_type(value, tag, WireType::LengthDelimited,
- encode_packed, merge_repeated,
- encoded_len_packed)?;
- }
- }
- }
- }
-
- );
-}
-varint!(bool, bool,
- to_uint64(value) u64::from(*value),
- from_uint64(value) value != 0);
-varint!(i32, int32);
-varint!(i64, int64);
-varint!(u32, uint32);
-varint!(u64, uint64);
-varint!(i32, sint32,
-to_uint64(value) {
- ((value << 1) ^ (value >> 31)) as u32 as u64
-},
-from_uint64(value) {
- let value = value as u32;
- ((value >> 1) as i32) ^ (-((value & 1) as i32))
-});
-varint!(i64, sint64,
-to_uint64(value) {
- ((value << 1) ^ (value >> 63)) as u64
-},
-from_uint64(value) {
- ((value >> 1) as i64) ^ (-((value & 1) as i64))
-});
-
-/// Macro which emits a module containing a set of encoding functions for a
-/// fixed width numeric type.
-macro_rules! fixed_width {
- ($ty:ty,
- $width:expr,
- $wire_type:expr,
- $proto_ty:ident,
- $put:ident,
- $get:ident) => {
- pub mod $proto_ty {
- use crate::encoding::*;
-
- pub fn encode(tag: u32, value: &$ty, buf: &mut impl BufMut) {
- encode_key(tag, $wire_type, buf);
- buf.$put(*value);
- }
-
- pub fn merge(
- wire_type: WireType,
- value: &mut $ty,
- buf: &mut impl Buf,
- _ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- check_wire_type($wire_type, wire_type)?;
- if buf.remaining() < $width {
- return Err(DecodeError::new("buffer underflow"));
- }
- *value = buf.$get();
- Ok(())
- }
-
- encode_repeated!($ty);
-
- pub fn encode_packed(tag: u32, values: &[$ty], buf: &mut impl BufMut) {
- if values.is_empty() {
- return;
- }
-
- encode_key(tag, WireType::LengthDelimited, buf);
- let len = values.len() as u64 * $width;
- encode_varint(len as u64, buf);
-
- for value in values {
- buf.$put(*value);
- }
- }
-
- merge_repeated_numeric!($ty, $wire_type, merge, merge_repeated);
-
- #[inline]
- pub fn encoded_len(tag: u32, _: &$ty) -> usize {
- key_len(tag) + $width
- }
-
- #[inline]
- pub fn encoded_len_repeated(tag: u32, values: &[$ty]) -> usize {
- (key_len(tag) + $width) * values.len()
- }
-
- #[inline]
- pub fn encoded_len_packed(tag: u32, values: &[$ty]) -> usize {
- if values.is_empty() {
- 0
- } else {
- let len = $width * values.len();
- key_len(tag) + encoded_len_varint(len as u64) + len
- }
- }
-
- #[cfg(test)]
- mod test {
- use proptest::prelude::*;
-
- use super::super::test::{check_collection_type, check_type};
- use super::*;
-
- proptest! {
- #[test]
- fn check(value: $ty, tag in MIN_TAG..=MAX_TAG) {
- check_type(value, tag, $wire_type,
- encode, merge, encoded_len)?;
- }
- #[test]
- fn check_repeated(value: Vec<$ty>, tag in MIN_TAG..=MAX_TAG) {
- check_collection_type(value, tag, $wire_type,
- encode_repeated, merge_repeated,
- encoded_len_repeated)?;
- }
- #[test]
- fn check_packed(value: Vec<$ty>, tag in MIN_TAG..=MAX_TAG) {
- check_type(value, tag, WireType::LengthDelimited,
- encode_packed, merge_repeated,
- encoded_len_packed)?;
- }
- }
- }
- }
- };
-}
-fixed_width!(
- f32,
- 4,
- WireType::ThirtyTwoBit,
- float,
- put_f32_le,
- get_f32_le
-);
-fixed_width!(
- f64,
- 8,
- WireType::SixtyFourBit,
- double,
- put_f64_le,
- get_f64_le
-);
-fixed_width!(
- u32,
- 4,
- WireType::ThirtyTwoBit,
- fixed32,
- put_u32_le,
- get_u32_le
-);
-fixed_width!(
- u64,
- 8,
- WireType::SixtyFourBit,
- fixed64,
- put_u64_le,
- get_u64_le
-);
-fixed_width!(
- i32,
- 4,
- WireType::ThirtyTwoBit,
- sfixed32,
- put_i32_le,
- get_i32_le
-);
-fixed_width!(
- i64,
- 8,
- WireType::SixtyFourBit,
- sfixed64,
- put_i64_le,
- get_i64_le
-);
-
-/// Macro which emits encoding functions for a length-delimited type.
-macro_rules! length_delimited {
- ($ty:ty) => {
- encode_repeated!($ty);
-
- pub fn merge_repeated(
- wire_type: WireType,
- values: &mut Vec<$ty>,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- check_wire_type(WireType::LengthDelimited, wire_type)?;
- let mut value = Default::default();
- merge(wire_type, &mut value, buf, ctx)?;
- values.push(value);
- Ok(())
- }
-
- #[inline]
- pub fn encoded_len(tag: u32, value: &$ty) -> usize {
- key_len(tag) + encoded_len_varint(value.len() as u64) + value.len()
- }
-
- #[inline]
- pub fn encoded_len_repeated(tag: u32, values: &[$ty]) -> usize {
- key_len(tag) * values.len()
- + values
- .iter()
- .map(|value| encoded_len_varint(value.len() as u64) + value.len())
- .sum::<usize>()
- }
- };
-}
-
-pub mod string {
- use super::*;
-
- pub fn encode(tag: u32, value: &String, buf: &mut impl BufMut) {
- encode_key(tag, WireType::LengthDelimited, buf);
- encode_varint(value.len() as u64, buf);
- buf.put_slice(value.as_bytes());
- }
-
- pub fn merge(
- wire_type: WireType,
- value: &mut String,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- // ## Unsafety
- //
- // `string::merge` reuses `bytes::merge`, with an additional check of utf-8
- // well-formedness. If the utf-8 is not well-formed, or if any other error occurs, then the
- // string is cleared, so as to avoid leaking a string field with invalid data.
- //
- // This implementation uses the unsafe `String::as_mut_vec` method instead of the safe
- // alternative of temporarily swapping an empty `String` into the field, because it results
- // in up to 10% better performance on the protobuf message decoding benchmarks.
- //
- // It's required when using `String::as_mut_vec` that invalid utf-8 data not be leaked into
- // the backing `String`. To enforce this, even in the event of a panic in `bytes::merge` or
- // in the buf implementation, a drop guard is used.
- unsafe {
- struct DropGuard<'a>(&'a mut Vec<u8>);
- impl Drop for DropGuard<'_> {
- #[inline]
- fn drop(&mut self) {
- self.0.clear();
- }
- }
-
- let drop_guard = DropGuard(value.as_mut_vec());
- bytes::merge_one_copy(wire_type, drop_guard.0, buf, ctx)?;
- match str::from_utf8(drop_guard.0) {
- Ok(_) => {
- // Success; do not clear the bytes.
- mem::forget(drop_guard);
- Ok(())
- }
- Err(_) => Err(DecodeError::new(
- "invalid string value: data is not UTF-8 encoded",
- )),
- }
- }
- }
-
- length_delimited!(String);
-
- #[cfg(test)]
- mod test {
- use proptest::prelude::*;
-
- use super::super::test::{check_collection_type, check_type};
- use super::*;
-
- proptest! {
- #[test]
- fn check(value: String, tag in MIN_TAG..=MAX_TAG) {
- super::test::check_type(value, tag, WireType::LengthDelimited,
- encode, merge, encoded_len)?;
- }
- #[test]
- fn check_repeated(value: Vec<String>, tag in MIN_TAG..=MAX_TAG) {
- super::test::check_collection_type(value, tag, WireType::LengthDelimited,
- encode_repeated, merge_repeated,
- encoded_len_repeated)?;
- }
- }
- }
-}
-
-pub trait BytesAdapter: sealed::BytesAdapter {}
-
-mod sealed {
- use super::{Buf, BufMut};
-
- pub trait BytesAdapter: Default + Sized + 'static {
- fn len(&self) -> usize;
-
- /// Replace contents of this buffer with the contents of another buffer.
- fn replace_with(&mut self, buf: impl Buf);
-
- /// Appends this buffer to the (contents of) other buffer.
- fn append_to(&self, buf: &mut impl BufMut);
-
- fn is_empty(&self) -> bool {
- self.len() == 0
- }
- }
-}
-
-impl BytesAdapter for Bytes {}
-
-impl sealed::BytesAdapter for Bytes {
- fn len(&self) -> usize {
- Buf::remaining(self)
- }
-
- fn replace_with(&mut self, mut buf: impl Buf) {
- *self = buf.copy_to_bytes(buf.remaining());
- }
-
- fn append_to(&self, buf: &mut impl BufMut) {
- buf.put(self.clone())
- }
-}
-
-impl BytesAdapter for Vec<u8> {}
-
-impl sealed::BytesAdapter for Vec<u8> {
- fn len(&self) -> usize {
- Vec::len(self)
- }
-
- fn replace_with(&mut self, buf: impl Buf) {
- self.clear();
- self.reserve(buf.remaining());
- self.put(buf);
- }
-
- fn append_to(&self, buf: &mut impl BufMut) {
- buf.put(self.as_slice())
- }
-}
-
-pub mod bytes {
- use super::*;
-
- pub fn encode(tag: u32, value: &impl BytesAdapter, buf: &mut impl BufMut) {
- encode_key(tag, WireType::LengthDelimited, buf);
- encode_varint(value.len() as u64, buf);
- value.append_to(buf);
- }
-
- pub fn merge(
- wire_type: WireType,
- value: &mut impl BytesAdapter,
- buf: &mut impl Buf,
- _ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- check_wire_type(WireType::LengthDelimited, wire_type)?;
- let len = decode_varint(buf)?;
- if len > buf.remaining() as u64 {
- return Err(DecodeError::new("buffer underflow"));
- }
- let len = len as usize;
-
- // Clear the existing value. This follows from the following rule in the encoding guide[1]:
- //
- // > Normally, an encoded message would never have more than one instance of a non-repeated
- // > field. However, parsers are expected to handle the case in which they do. For numeric
- // > types and strings, if the same field appears multiple times, the parser accepts the
- // > last value it sees.
- //
- // [1]: https://developers.google.com/protocol-buffers/docs/encoding#optional
- //
- // This is intended for A and B both being Bytes so it is zero-copy.
- // Some combinations of A and B types may cause a double-copy,
- // in which case merge_one_copy() should be used instead.
- value.replace_with(buf.copy_to_bytes(len));
- Ok(())
- }
-
- pub(super) fn merge_one_copy(
- wire_type: WireType,
- value: &mut impl BytesAdapter,
- buf: &mut impl Buf,
- _ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- check_wire_type(WireType::LengthDelimited, wire_type)?;
- let len = decode_varint(buf)?;
- if len > buf.remaining() as u64 {
- return Err(DecodeError::new("buffer underflow"));
- }
- let len = len as usize;
-
- // If we must copy, make sure to copy only once.
- value.replace_with(buf.take(len));
- Ok(())
- }
-
- length_delimited!(impl BytesAdapter);
-
- #[cfg(test)]
- mod test {
- use proptest::prelude::*;
-
- use super::super::test::{check_collection_type, check_type};
- use super::*;
-
- proptest! {
- #[test]
- fn check_vec(value: Vec<u8>, tag in MIN_TAG..=MAX_TAG) {
- super::test::check_type::<Vec<u8>, Vec<u8>>(value, tag, WireType::LengthDelimited,
- encode, merge, encoded_len)?;
- }
-
- #[test]
- fn check_bytes(value: Vec<u8>, tag in MIN_TAG..=MAX_TAG) {
- let value = Bytes::from(value);
- super::test::check_type::<Bytes, Bytes>(value, tag, WireType::LengthDelimited,
- encode, merge, encoded_len)?;
- }
-
- #[test]
- fn check_repeated_vec(value: Vec<Vec<u8>>, tag in MIN_TAG..=MAX_TAG) {
- super::test::check_collection_type(value, tag, WireType::LengthDelimited,
- encode_repeated, merge_repeated,
- encoded_len_repeated)?;
- }
-
- #[test]
- fn check_repeated_bytes(value: Vec<Vec<u8>>, tag in MIN_TAG..=MAX_TAG) {
- let value = value.into_iter().map(Bytes::from).collect();
- super::test::check_collection_type(value, tag, WireType::LengthDelimited,
- encode_repeated, merge_repeated,
- encoded_len_repeated)?;
- }
- }
- }
-}
-
-pub mod message {
- use super::*;
-
- pub fn encode<M>(tag: u32, msg: &M, buf: &mut impl BufMut)
- where
- M: Message,
- {
- encode_key(tag, WireType::LengthDelimited, buf);
- encode_varint(msg.encoded_len() as u64, buf);
- msg.encode_raw(buf);
- }
-
- pub fn merge<M, B>(
- wire_type: WireType,
- msg: &mut M,
- buf: &mut B,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError>
- where
- M: Message,
- B: Buf,
- {
- check_wire_type(WireType::LengthDelimited, wire_type)?;
- ctx.limit_reached()?;
- merge_loop(
- msg,
- buf,
- ctx.enter_recursion(),
- |msg: &mut M, buf: &mut B, ctx| {
- let (tag, wire_type) = decode_key(buf)?;
- msg.merge_field(tag, wire_type, buf, ctx)
- },
- )
- }
-
- pub fn encode_repeated<M>(tag: u32, messages: &[M], buf: &mut impl BufMut)
- where
- M: Message,
- {
- for msg in messages {
- encode(tag, msg, buf);
- }
- }
-
- pub fn merge_repeated<M>(
- wire_type: WireType,
- messages: &mut Vec<M>,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError>
- where
- M: Message + Default,
- {
- check_wire_type(WireType::LengthDelimited, wire_type)?;
- let mut msg = M::default();
- merge(WireType::LengthDelimited, &mut msg, buf, ctx)?;
- messages.push(msg);
- Ok(())
- }
-
- #[inline]
- pub fn encoded_len<M>(tag: u32, msg: &M) -> usize
- where
- M: Message,
- {
- let len = msg.encoded_len();
- key_len(tag) + encoded_len_varint(len as u64) + len
- }
-
- #[inline]
- pub fn encoded_len_repeated<M>(tag: u32, messages: &[M]) -> usize
- where
- M: Message,
- {
- key_len(tag) * messages.len()
- + messages
- .iter()
- .map(Message::encoded_len)
- .map(|len| len + encoded_len_varint(len as u64))
- .sum::<usize>()
- }
-}
-
-pub mod group {
- use super::*;
-
- pub fn encode<M>(tag: u32, msg: &M, buf: &mut impl BufMut)
- where
- M: Message,
- {
- encode_key(tag, WireType::StartGroup, buf);
- msg.encode_raw(buf);
- encode_key(tag, WireType::EndGroup, buf);
- }
-
- pub fn merge<M>(
- tag: u32,
- wire_type: WireType,
- msg: &mut M,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError>
- where
- M: Message,
- {
- check_wire_type(WireType::StartGroup, wire_type)?;
-
- ctx.limit_reached()?;
- loop {
- let (field_tag, field_wire_type) = decode_key(buf)?;
- if field_wire_type == WireType::EndGroup {
- if field_tag != tag {
- return Err(DecodeError::new("unexpected end group tag"));
- }
- return Ok(());
- }
-
- M::merge_field(msg, field_tag, field_wire_type, buf, ctx.enter_recursion())?;
- }
- }
-
- pub fn encode_repeated<M>(tag: u32, messages: &[M], buf: &mut impl BufMut)
- where
- M: Message,
- {
- for msg in messages {
- encode(tag, msg, buf);
- }
- }
-
- pub fn merge_repeated<M>(
- tag: u32,
- wire_type: WireType,
- messages: &mut Vec<M>,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError>
- where
- M: Message + Default,
- {
- check_wire_type(WireType::StartGroup, wire_type)?;
- let mut msg = M::default();
- merge(tag, WireType::StartGroup, &mut msg, buf, ctx)?;
- messages.push(msg);
- Ok(())
- }
-
- #[inline]
- pub fn encoded_len<M>(tag: u32, msg: &M) -> usize
- where
- M: Message,
- {
- 2 * key_len(tag) + msg.encoded_len()
- }
-
- #[inline]
- pub fn encoded_len_repeated<M>(tag: u32, messages: &[M]) -> usize
- where
- M: Message,
- {
- 2 * key_len(tag) * messages.len() + messages.iter().map(Message::encoded_len).sum::<usize>()
- }
-}
-
-/// Rust doesn't have a `Map` trait, so macros are currently the best way to be
-/// generic over `HashMap` and `BTreeMap`.
-macro_rules! map {
- ($map_ty:ident) => {
- use crate::encoding::*;
- use core::hash::Hash;
-
- /// Generic protobuf map encode function.
- pub fn encode<K, V, B, KE, KL, VE, VL>(
- key_encode: KE,
- key_encoded_len: KL,
- val_encode: VE,
- val_encoded_len: VL,
- tag: u32,
- values: &$map_ty<K, V>,
- buf: &mut B,
- ) where
- K: Default + Eq + Hash + Ord,
- V: Default + PartialEq,
- B: BufMut,
- KE: Fn(u32, &K, &mut B),
- KL: Fn(u32, &K) -> usize,
- VE: Fn(u32, &V, &mut B),
- VL: Fn(u32, &V) -> usize,
- {
- encode_with_default(
- key_encode,
- key_encoded_len,
- val_encode,
- val_encoded_len,
- &V::default(),
- tag,
- values,
- buf,
- )
- }
-
- /// Generic protobuf map merge function.
- pub fn merge<K, V, B, KM, VM>(
- key_merge: KM,
- val_merge: VM,
- values: &mut $map_ty<K, V>,
- buf: &mut B,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError>
- where
- K: Default + Eq + Hash + Ord,
- V: Default,
- B: Buf,
- KM: Fn(WireType, &mut K, &mut B, DecodeContext) -> Result<(), DecodeError>,
- VM: Fn(WireType, &mut V, &mut B, DecodeContext) -> Result<(), DecodeError>,
- {
- merge_with_default(key_merge, val_merge, V::default(), values, buf, ctx)
- }
-
- /// Generic protobuf map encode function.
- pub fn encoded_len<K, V, KL, VL>(
- key_encoded_len: KL,
- val_encoded_len: VL,
- tag: u32,
- values: &$map_ty<K, V>,
- ) -> usize
- where
- K: Default + Eq + Hash + Ord,
- V: Default + PartialEq,
- KL: Fn(u32, &K) -> usize,
- VL: Fn(u32, &V) -> usize,
- {
- encoded_len_with_default(key_encoded_len, val_encoded_len, &V::default(), tag, values)
- }
-
- /// Generic protobuf map encode function with an overridden value default.
- ///
- /// This is necessary because enumeration values can have a default value other
- /// than 0 in proto2.
- pub fn encode_with_default<K, V, B, KE, KL, VE, VL>(
- key_encode: KE,
- key_encoded_len: KL,
- val_encode: VE,
- val_encoded_len: VL,
- val_default: &V,
- tag: u32,
- values: &$map_ty<K, V>,
- buf: &mut B,
- ) where
- K: Default + Eq + Hash + Ord,
- V: PartialEq,
- B: BufMut,
- KE: Fn(u32, &K, &mut B),
- KL: Fn(u32, &K) -> usize,
- VE: Fn(u32, &V, &mut B),
- VL: Fn(u32, &V) -> usize,
- {
- for (key, val) in values.iter() {
- let skip_key = key == &K::default();
- let skip_val = val == val_default;
-
- let len = (if skip_key { 0 } else { key_encoded_len(1, key) })
- + (if skip_val { 0 } else { val_encoded_len(2, val) });
-
- encode_key(tag, WireType::LengthDelimited, buf);
- encode_varint(len as u64, buf);
- if !skip_key {
- key_encode(1, key, buf);
- }
- if !skip_val {
- val_encode(2, val, buf);
- }
- }
- }
-
- /// Generic protobuf map merge function with an overridden value default.
- ///
- /// This is necessary because enumeration values can have a default value other
- /// than 0 in proto2.
- pub fn merge_with_default<K, V, B, KM, VM>(
- key_merge: KM,
- val_merge: VM,
- val_default: V,
- values: &mut $map_ty<K, V>,
- buf: &mut B,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError>
- where
- K: Default + Eq + Hash + Ord,
- B: Buf,
- KM: Fn(WireType, &mut K, &mut B, DecodeContext) -> Result<(), DecodeError>,
- VM: Fn(WireType, &mut V, &mut B, DecodeContext) -> Result<(), DecodeError>,
- {
- let mut key = Default::default();
- let mut val = val_default;
- ctx.limit_reached()?;
- merge_loop(
- &mut (&mut key, &mut val),
- buf,
- ctx.enter_recursion(),
- |&mut (ref mut key, ref mut val), buf, ctx| {
- let (tag, wire_type) = decode_key(buf)?;
- match tag {
- 1 => key_merge(wire_type, key, buf, ctx),
- 2 => val_merge(wire_type, val, buf, ctx),
- _ => skip_field(wire_type, tag, buf, ctx),
- }
- },
- )?;
- values.insert(key, val);
-
- Ok(())
- }
-
- /// Generic protobuf map encode function with an overridden value default.
- ///
- /// This is necessary because enumeration values can have a default value other
- /// than 0 in proto2.
- pub fn encoded_len_with_default<K, V, KL, VL>(
- key_encoded_len: KL,
- val_encoded_len: VL,
- val_default: &V,
- tag: u32,
- values: &$map_ty<K, V>,
- ) -> usize
- where
- K: Default + Eq + Hash + Ord,
- V: PartialEq,
- KL: Fn(u32, &K) -> usize,
- VL: Fn(u32, &V) -> usize,
- {
- key_len(tag) * values.len()
- + values
- .iter()
- .map(|(key, val)| {
- let len = (if key == &K::default() {
- 0
- } else {
- key_encoded_len(1, key)
- }) + (if val == val_default {
- 0
- } else {
- val_encoded_len(2, val)
- });
- encoded_len_varint(len as u64) + len
- })
- .sum::<usize>()
- }
- };
-}
-
-#[cfg(feature = "std")]
-pub mod hash_map {
- use std::collections::HashMap;
- map!(HashMap);
-}
-
-pub mod btree_map {
- map!(BTreeMap);
-}
-
-#[cfg(test)]
-mod test {
- #[cfg(not(feature = "std"))]
- use alloc::string::ToString;
- use core::borrow::Borrow;
- use core::fmt::Debug;
-
- use ::bytes::BytesMut;
- use proptest::{prelude::*, test_runner::TestCaseResult};
-
- use super::*;
-
- pub fn check_type<T, B>(
- value: T,
- tag: u32,
- wire_type: WireType,
- encode: fn(u32, &B, &mut BytesMut),
- merge: fn(WireType, &mut T, &mut Bytes, DecodeContext) -> Result<(), DecodeError>,
- encoded_len: fn(u32, &B) -> usize,
- ) -> TestCaseResult
- where
- T: Debug + Default + PartialEq + Borrow<B>,
- B: ?Sized,
- {
- prop_assume!((MIN_TAG..=MAX_TAG).contains(&tag));
-
- let expected_len = encoded_len(tag, value.borrow());
-
- let mut buf = BytesMut::with_capacity(expected_len);
- encode(tag, value.borrow(), &mut buf);
-
- let mut buf = buf.freeze();
-
- prop_assert_eq!(
- buf.remaining(),
- expected_len,
- "encoded_len wrong; expected: {}, actual: {}",
- expected_len,
- buf.remaining()
- );
-
- if !buf.has_remaining() {
- // Short circuit for empty packed values.
- return Ok(());
- }
-
- let (decoded_tag, decoded_wire_type) =
- decode_key(&mut buf).map_err(|error| TestCaseError::fail(error.to_string()))?;
- prop_assert_eq!(
- tag,
- decoded_tag,
- "decoded tag does not match; expected: {}, actual: {}",
- tag,
- decoded_tag
- );
-
- prop_assert_eq!(
- wire_type,
- decoded_wire_type,
- "decoded wire type does not match; expected: {:?}, actual: {:?}",
- wire_type,
- decoded_wire_type,
- );
-
- match wire_type {
- WireType::SixtyFourBit if buf.remaining() != 8 => Err(TestCaseError::fail(format!(
- "64bit wire type illegal remaining: {}, tag: {}",
- buf.remaining(),
- tag
- ))),
- WireType::ThirtyTwoBit if buf.remaining() != 4 => Err(TestCaseError::fail(format!(
- "32bit wire type illegal remaining: {}, tag: {}",
- buf.remaining(),
- tag
- ))),
- _ => Ok(()),
- }?;
-
- let mut roundtrip_value = T::default();
- merge(
- wire_type,
- &mut roundtrip_value,
- &mut buf,
- DecodeContext::default(),
- )
- .map_err(|error| TestCaseError::fail(error.to_string()))?;
-
- prop_assert!(
- !buf.has_remaining(),
- "expected buffer to be empty, remaining: {}",
- buf.remaining()
- );
-
- prop_assert_eq!(value, roundtrip_value);
-
- Ok(())
- }
-
- pub fn check_collection_type<T, B, E, M, L>(
- value: T,
- tag: u32,
- wire_type: WireType,
- encode: E,
- mut merge: M,
- encoded_len: L,
- ) -> TestCaseResult
- where
- T: Debug + Default + PartialEq + Borrow<B>,
- B: ?Sized,
- E: FnOnce(u32, &B, &mut BytesMut),
- M: FnMut(WireType, &mut T, &mut Bytes, DecodeContext) -> Result<(), DecodeError>,
- L: FnOnce(u32, &B) -> usize,
- {
- prop_assume!((MIN_TAG..=MAX_TAG).contains(&tag));
-
- let expected_len = encoded_len(tag, value.borrow());
-
- let mut buf = BytesMut::with_capacity(expected_len);
- encode(tag, value.borrow(), &mut buf);
-
- let mut buf = buf.freeze();
-
- prop_assert_eq!(
- buf.remaining(),
- expected_len,
- "encoded_len wrong; expected: {}, actual: {}",
- expected_len,
- buf.remaining()
- );
-
- let mut roundtrip_value = Default::default();
- while buf.has_remaining() {
- let (decoded_tag, decoded_wire_type) =
- decode_key(&mut buf).map_err(|error| TestCaseError::fail(error.to_string()))?;
-
- prop_assert_eq!(
- tag,
- decoded_tag,
- "decoded tag does not match; expected: {}, actual: {}",
- tag,
- decoded_tag
- );
-
- prop_assert_eq!(
- wire_type,
- decoded_wire_type,
- "decoded wire type does not match; expected: {:?}, actual: {:?}",
- wire_type,
- decoded_wire_type
- );
-
- merge(
- wire_type,
- &mut roundtrip_value,
- &mut buf,
- DecodeContext::default(),
- )
- .map_err(|error| TestCaseError::fail(error.to_string()))?;
- }
-
- prop_assert_eq!(value, roundtrip_value);
-
- Ok(())
- }
-
- #[test]
- fn string_merge_invalid_utf8() {
- let mut s = String::new();
- let buf = b"\x02\x80\x80";
-
- let r = string::merge(
- WireType::LengthDelimited,
- &mut s,
- &mut &buf[..],
- DecodeContext::default(),
- );
- r.expect_err("must be an error");
- assert!(s.is_empty());
- }
-
- /// This big bowl o' macro soup generates an encoding property test for each combination of map
- /// type, scalar map key, and value type.
- /// TODO: these tests take a long time to compile, can this be improved?
- #[cfg(feature = "std")]
- macro_rules! map_tests {
- (keys: $keys:tt,
- vals: $vals:tt) => {
- mod hash_map {
- map_tests!(@private HashMap, hash_map, $keys, $vals);
- }
- mod btree_map {
- map_tests!(@private BTreeMap, btree_map, $keys, $vals);
- }
- };
-
- (@private $map_type:ident,
- $mod_name:ident,
- [$(($key_ty:ty, $key_proto:ident)),*],
- $vals:tt) => {
- $(
- mod $key_proto {
- use std::collections::$map_type;
-
- use proptest::prelude::*;
-
- use crate::encoding::*;
- use crate::encoding::test::check_collection_type;
-
- map_tests!(@private $map_type, $mod_name, ($key_ty, $key_proto), $vals);
- }
- )*
- };
-
- (@private $map_type:ident,
- $mod_name:ident,
- ($key_ty:ty, $key_proto:ident),
- [$(($val_ty:ty, $val_proto:ident)),*]) => {
- $(
- proptest! {
- #[test]
- fn $val_proto(values: $map_type<$key_ty, $val_ty>, tag in MIN_TAG..=MAX_TAG) {
- check_collection_type(values, tag, WireType::LengthDelimited,
- |tag, values, buf| {
- $mod_name::encode($key_proto::encode,
- $key_proto::encoded_len,
- $val_proto::encode,
- $val_proto::encoded_len,
- tag,
- values,
- buf)
- },
- |wire_type, values, buf, ctx| {
- check_wire_type(WireType::LengthDelimited, wire_type)?;
- $mod_name::merge($key_proto::merge,
- $val_proto::merge,
- values,
- buf,
- ctx)
- },
- |tag, values| {
- $mod_name::encoded_len($key_proto::encoded_len,
- $val_proto::encoded_len,
- tag,
- values)
- })?;
- }
- }
- )*
- };
- }
-
- #[cfg(feature = "std")]
- map_tests!(keys: [
- (i32, int32),
- (i64, int64),
- (u32, uint32),
- (u64, uint64),
- (i32, sint32),
- (i64, sint64),
- (u32, fixed32),
- (u64, fixed64),
- (i32, sfixed32),
- (i64, sfixed64),
- (bool, bool),
- (String, string)
- ],
- vals: [
- (f32, float),
- (f64, double),
- (i32, int32),
- (i64, int64),
- (u32, uint32),
- (u64, uint64),
- (i32, sint32),
- (i64, sint64),
- (u32, fixed32),
- (u64, fixed64),
- (i32, sfixed32),
- (i64, sfixed64),
- (bool, bool),
- (String, string),
- (Vec<u8>, bytes)
- ]);
-}
diff --git a/vendor/prost/src/encoding/length_delimiter.rs b/vendor/prost/src/encoding/length_delimiter.rs
deleted file mode 100644
index 6aa7e4cb..00000000
--- a/vendor/prost/src/encoding/length_delimiter.rs
+++ /dev/null
@@ -1,53 +0,0 @@
-pub use crate::error::{DecodeError, EncodeError, UnknownEnumValue};
-pub use crate::message::Message;
-pub use crate::name::Name;
-
-use bytes::{Buf, BufMut};
-
-use crate::encoding::varint::{decode_varint, encode_varint, encoded_len_varint};
-
-/// Encodes a length delimiter to the buffer.
-///
-/// See [Message.encode_length_delimited] for more info.
-///
-/// An error will be returned if the buffer does not have sufficient capacity to encode the
-/// delimiter.
-pub fn encode_length_delimiter(length: usize, buf: &mut impl BufMut) -> Result<(), EncodeError> {
- let length = length as u64;
- let required = encoded_len_varint(length);
- let remaining = buf.remaining_mut();
- if required > remaining {
- return Err(EncodeError::new(required, remaining));
- }
- encode_varint(length, buf);
- Ok(())
-}
-
-/// Returns the encoded length of a length delimiter.
-///
-/// Applications may use this method to ensure sufficient buffer capacity before calling
-/// `encode_length_delimiter`. The returned size will be between 1 and 10, inclusive.
-pub fn length_delimiter_len(length: usize) -> usize {
- encoded_len_varint(length as u64)
-}
-
-/// Decodes a length delimiter from the buffer.
-///
-/// This method allows the length delimiter to be decoded independently of the message, when the
-/// message is encoded with [Message.encode_length_delimited].
-///
-/// An error may be returned in two cases:
-///
-/// * If the supplied buffer contains fewer than 10 bytes, then an error indicates that more
-/// input is required to decode the full delimiter.
-/// * If the supplied buffer contains 10 bytes or more, then the buffer contains an invalid
-/// delimiter, and typically the buffer should be considered corrupt.
-pub fn decode_length_delimiter(mut buf: impl Buf) -> Result<usize, DecodeError> {
- let length = decode_varint(&mut buf)?;
- if length > usize::MAX as u64 {
- return Err(DecodeError::new(
- "length delimiter exceeds maximum usize value",
- ));
- }
- Ok(length as usize)
-}
diff --git a/vendor/prost/src/encoding/varint.rs b/vendor/prost/src/encoding/varint.rs
deleted file mode 100644
index 372b2165..00000000
--- a/vendor/prost/src/encoding/varint.rs
+++ /dev/null
@@ -1,274 +0,0 @@
-use core::cmp::min;
-use core::num::NonZeroU64;
-
-use ::bytes::{Buf, BufMut};
-
-use crate::DecodeError;
-
-/// Encodes an integer value into LEB128 variable length format, and writes it to the buffer.
-/// The buffer must have enough remaining space (maximum 10 bytes).
-#[inline]
-pub fn encode_varint(mut value: u64, buf: &mut impl BufMut) {
- // Varints are never more than 10 bytes
- for _ in 0..10 {
- if value < 0x80 {
- buf.put_u8(value as u8);
- break;
- } else {
- buf.put_u8(((value & 0x7F) | 0x80) as u8);
- value >>= 7;
- }
- }
-}
-
-/// Returns the encoded length of the value in LEB128 variable length format.
-/// The returned value will be between 1 and 10, inclusive.
-#[inline]
-pub const fn encoded_len_varint(value: u64) -> usize {
- // Based on [VarintSize64][1].
- // [1]: https://github.com/protocolbuffers/protobuf/blob/v28.3/src/google/protobuf/io/coded_stream.h#L1744-L1756
- // Safety: value | 1 is non-zero.
- let log2value = unsafe { NonZeroU64::new_unchecked(value | 1) }.ilog2();
- ((log2value * 9 + (64 + 9)) / 64) as usize
-}
-
-/// Decodes a LEB128-encoded variable length integer from the buffer.
-#[inline]
-pub fn decode_varint(buf: &mut impl Buf) -> Result<u64, DecodeError> {
- let bytes = buf.chunk();
- let len = bytes.len();
- if len == 0 {
- return Err(DecodeError::new("invalid varint"));
- }
-
- let byte = bytes[0];
- if byte < 0x80 {
- buf.advance(1);
- Ok(u64::from(byte))
- } else if len > 10 || bytes[len - 1] < 0x80 {
- let (value, advance) = decode_varint_slice(bytes)?;
- buf.advance(advance);
- Ok(value)
- } else {
- decode_varint_slow(buf)
- }
-}
-
-/// Decodes a LEB128-encoded variable length integer from the slice, returning the value and the
-/// number of bytes read.
-///
-/// Based loosely on [`ReadVarint64FromArray`][1] with a varint overflow check from
-/// [`ConsumeVarint`][2].
-///
-/// ## Safety
-///
-/// The caller must ensure that `bytes` is non-empty and either `bytes.len() >= 10` or the last
-/// element in bytes is < `0x80`.
-///
-/// [1]: https://github.com/google/protobuf/blob/3.3.x/src/google/protobuf/io/coded_stream.cc#L365-L406
-/// [2]: https://github.com/protocolbuffers/protobuf-go/blob/v1.27.1/encoding/protowire/wire.go#L358
-#[inline]
-fn decode_varint_slice(bytes: &[u8]) -> Result<(u64, usize), DecodeError> {
- // Fully unrolled varint decoding loop. Splitting into 32-bit pieces gives better performance.
-
- // Use assertions to ensure memory safety, but it should always be optimized after inline.
- assert!(!bytes.is_empty());
- assert!(bytes.len() > 10 || bytes[bytes.len() - 1] < 0x80);
-
- let mut b: u8 = unsafe { *bytes.get_unchecked(0) };
- let mut part0: u32 = u32::from(b);
- if b < 0x80 {
- return Ok((u64::from(part0), 1));
- };
- part0 -= 0x80;
- b = unsafe { *bytes.get_unchecked(1) };
- part0 += u32::from(b) << 7;
- if b < 0x80 {
- return Ok((u64::from(part0), 2));
- };
- part0 -= 0x80 << 7;
- b = unsafe { *bytes.get_unchecked(2) };
- part0 += u32::from(b) << 14;
- if b < 0x80 {
- return Ok((u64::from(part0), 3));
- };
- part0 -= 0x80 << 14;
- b = unsafe { *bytes.get_unchecked(3) };
- part0 += u32::from(b) << 21;
- if b < 0x80 {
- return Ok((u64::from(part0), 4));
- };
- part0 -= 0x80 << 21;
- let value = u64::from(part0);
-
- b = unsafe { *bytes.get_unchecked(4) };
- let mut part1: u32 = u32::from(b);
- if b < 0x80 {
- return Ok((value + (u64::from(part1) << 28), 5));
- };
- part1 -= 0x80;
- b = unsafe { *bytes.get_unchecked(5) };
- part1 += u32::from(b) << 7;
- if b < 0x80 {
- return Ok((value + (u64::from(part1) << 28), 6));
- };
- part1 -= 0x80 << 7;
- b = unsafe { *bytes.get_unchecked(6) };
- part1 += u32::from(b) << 14;
- if b < 0x80 {
- return Ok((value + (u64::from(part1) << 28), 7));
- };
- part1 -= 0x80 << 14;
- b = unsafe { *bytes.get_unchecked(7) };
- part1 += u32::from(b) << 21;
- if b < 0x80 {
- return Ok((value + (u64::from(part1) << 28), 8));
- };
- part1 -= 0x80 << 21;
- let value = value + ((u64::from(part1)) << 28);
-
- b = unsafe { *bytes.get_unchecked(8) };
- let mut part2: u32 = u32::from(b);
- if b < 0x80 {
- return Ok((value + (u64::from(part2) << 56), 9));
- };
- part2 -= 0x80;
- b = unsafe { *bytes.get_unchecked(9) };
- part2 += u32::from(b) << 7;
- // Check for u64::MAX overflow. See [`ConsumeVarint`][1] for details.
- // [1]: https://github.com/protocolbuffers/protobuf-go/blob/v1.27.1/encoding/protowire/wire.go#L358
- if b < 0x02 {
- return Ok((value + (u64::from(part2) << 56), 10));
- };
-
- // We have overrun the maximum size of a varint (10 bytes) or the final byte caused an overflow.
- // Assume the data is corrupt.
- Err(DecodeError::new("invalid varint"))
-}
-
-/// Decodes a LEB128-encoded variable length integer from the buffer, advancing the buffer as
-/// necessary.
-///
-/// Contains a varint overflow check from [`ConsumeVarint`][1].
-///
-/// [1]: https://github.com/protocolbuffers/protobuf-go/blob/v1.27.1/encoding/protowire/wire.go#L358
-#[inline(never)]
-#[cold]
-fn decode_varint_slow(buf: &mut impl Buf) -> Result<u64, DecodeError> {
- let mut value = 0;
- for count in 0..min(10, buf.remaining()) {
- let byte = buf.get_u8();
- value |= u64::from(byte & 0x7F) << (count * 7);
- if byte <= 0x7F {
- // Check for u64::MAX overflow. See [`ConsumeVarint`][1] for details.
- // [1]: https://github.com/protocolbuffers/protobuf-go/blob/v1.27.1/encoding/protowire/wire.go#L358
- if count == 9 && byte >= 0x02 {
- return Err(DecodeError::new("invalid varint"));
- } else {
- return Ok(value);
- }
- }
- }
-
- Err(DecodeError::new("invalid varint"))
-}
-
-#[cfg(test)]
-mod test {
- use super::*;
-
- #[test]
- fn varint() {
- fn check(value: u64, encoded: &[u8]) {
- // Small buffer.
- let mut buf = Vec::with_capacity(1);
- encode_varint(value, &mut buf);
- assert_eq!(buf, encoded);
-
- // Large buffer.
- let mut buf = Vec::with_capacity(100);
- encode_varint(value, &mut buf);
- assert_eq!(buf, encoded);
-
- assert_eq!(encoded_len_varint(value), encoded.len());
-
- // See: https://github.com/tokio-rs/prost/pull/1008 for copying reasoning.
- let mut encoded_copy = encoded;
- let roundtrip_value = decode_varint(&mut encoded_copy).expect("decoding failed");
- assert_eq!(value, roundtrip_value);
-
- let mut encoded_copy = encoded;
- let roundtrip_value =
- decode_varint_slow(&mut encoded_copy).expect("slow decoding failed");
- assert_eq!(value, roundtrip_value);
- }
-
- check(2u64.pow(0) - 1, &[0x00]);
- check(2u64.pow(0), &[0x01]);
-
- check(2u64.pow(7) - 1, &[0x7F]);
- check(2u64.pow(7), &[0x80, 0x01]);
- check(300, &[0xAC, 0x02]);
-
- check(2u64.pow(14) - 1, &[0xFF, 0x7F]);
- check(2u64.pow(14), &[0x80, 0x80, 0x01]);
-
- check(2u64.pow(21) - 1, &[0xFF, 0xFF, 0x7F]);
- check(2u64.pow(21), &[0x80, 0x80, 0x80, 0x01]);
-
- check(2u64.pow(28) - 1, &[0xFF, 0xFF, 0xFF, 0x7F]);
- check(2u64.pow(28), &[0x80, 0x80, 0x80, 0x80, 0x01]);
-
- check(2u64.pow(35) - 1, &[0xFF, 0xFF, 0xFF, 0xFF, 0x7F]);
- check(2u64.pow(35), &[0x80, 0x80, 0x80, 0x80, 0x80, 0x01]);
-
- check(2u64.pow(42) - 1, &[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F]);
- check(2u64.pow(42), &[0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01]);
-
- check(
- 2u64.pow(49) - 1,
- &[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F],
- );
- check(
- 2u64.pow(49),
- &[0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01],
- );
-
- check(
- 2u64.pow(56) - 1,
- &[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F],
- );
- check(
- 2u64.pow(56),
- &[0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01],
- );
-
- check(
- 2u64.pow(63) - 1,
- &[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F],
- );
- check(
- 2u64.pow(63),
- &[0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01],
- );
-
- check(
- u64::MAX,
- &[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01],
- );
- }
-
- const U64_MAX_PLUS_ONE: &[u8] = &[0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02];
-
- #[test]
- fn varint_overflow() {
- let mut copy = U64_MAX_PLUS_ONE;
- decode_varint(&mut copy).expect_err("decoding u64::MAX + 1 succeeded");
- }
-
- #[test]
- fn variant_slow_overflow() {
- let mut copy = U64_MAX_PLUS_ONE;
- decode_varint_slow(&mut copy).expect_err("slow decoding u64::MAX + 1 succeeded");
- }
-}
diff --git a/vendor/prost/src/encoding/wire_type.rs b/vendor/prost/src/encoding/wire_type.rs
deleted file mode 100644
index 74a857a2..00000000
--- a/vendor/prost/src/encoding/wire_type.rs
+++ /dev/null
@@ -1,49 +0,0 @@
-use crate::DecodeError;
-use alloc::format;
-
-/// Represent the wire type for protobuf encoding.
-///
-/// The integer value is equvilant with the encoded value.
-#[derive(Clone, Copy, Debug, PartialEq, Eq)]
-#[repr(u8)]
-pub enum WireType {
- Varint = 0,
- SixtyFourBit = 1,
- LengthDelimited = 2,
- StartGroup = 3,
- EndGroup = 4,
- ThirtyTwoBit = 5,
-}
-
-impl TryFrom<u64> for WireType {
- type Error = DecodeError;
-
- #[inline]
- fn try_from(value: u64) -> Result<Self, Self::Error> {
- match value {
- 0 => Ok(WireType::Varint),
- 1 => Ok(WireType::SixtyFourBit),
- 2 => Ok(WireType::LengthDelimited),
- 3 => Ok(WireType::StartGroup),
- 4 => Ok(WireType::EndGroup),
- 5 => Ok(WireType::ThirtyTwoBit),
- _ => Err(DecodeError::new(format!(
- "invalid wire type value: {}",
- value
- ))),
- }
- }
-}
-
-/// Checks that the expected wire type matches the actual wire type,
-/// or returns an error result.
-#[inline]
-pub fn check_wire_type(expected: WireType, actual: WireType) -> Result<(), DecodeError> {
- if expected != actual {
- return Err(DecodeError::new(format!(
- "invalid wire type: {:?} (expected {:?})",
- actual, expected
- )));
- }
- Ok(())
-}
diff --git a/vendor/prost/src/error.rs b/vendor/prost/src/error.rs
deleted file mode 100644
index b4617859..00000000
--- a/vendor/prost/src/error.rs
+++ /dev/null
@@ -1,180 +0,0 @@
-//! Protobuf encoding and decoding errors.
-
-use alloc::borrow::Cow;
-#[cfg(not(feature = "std"))]
-use alloc::boxed::Box;
-#[cfg(not(feature = "std"))]
-use alloc::vec::Vec;
-
-use core::fmt;
-
-/// A Protobuf message decoding error.
-///
-/// `DecodeError` indicates that the input buffer does not contain a valid
-/// Protobuf message. The error details should be considered 'best effort': in
-/// general it is not possible to exactly pinpoint why data is malformed.
-#[derive(Clone, PartialEq, Eq)]
-pub struct DecodeError {
- inner: Box<Inner>,
-}
-
-#[derive(Clone, PartialEq, Eq)]
-struct Inner {
- /// A 'best effort' root cause description.
- description: Cow<'static, str>,
- /// A stack of (message, field) name pairs, which identify the specific
- /// message type and field where decoding failed. The stack contains an
- /// entry per level of nesting.
- stack: Vec<(&'static str, &'static str)>,
-}
-
-impl DecodeError {
- /// Creates a new `DecodeError` with a 'best effort' root cause description.
- ///
- /// Meant to be used only by `Message` implementations.
- #[doc(hidden)]
- #[cold]
- pub fn new(description: impl Into<Cow<'static, str>>) -> DecodeError {
- DecodeError {
- inner: Box::new(Inner {
- description: description.into(),
- stack: Vec::new(),
- }),
- }
- }
-
- /// Pushes a (message, field) name location pair on to the location stack.
- ///
- /// Meant to be used only by `Message` implementations.
- #[doc(hidden)]
- pub fn push(&mut self, message: &'static str, field: &'static str) {
- self.inner.stack.push((message, field));
- }
-}
-
-impl fmt::Debug for DecodeError {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("DecodeError")
- .field("description", &self.inner.description)
- .field("stack", &self.inner.stack)
- .finish()
- }
-}
-
-impl fmt::Display for DecodeError {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.write_str("failed to decode Protobuf message: ")?;
- for &(message, field) in &self.inner.stack {
- write!(f, "{}.{}: ", message, field)?;
- }
- f.write_str(&self.inner.description)
- }
-}
-
-#[cfg(feature = "std")]
-impl std::error::Error for DecodeError {}
-
-#[cfg(feature = "std")]
-impl From<DecodeError> for std::io::Error {
- fn from(error: DecodeError) -> std::io::Error {
- std::io::Error::new(std::io::ErrorKind::InvalidData, error)
- }
-}
-
-/// A Protobuf message encoding error.
-///
-/// `EncodeError` always indicates that a message failed to encode because the
-/// provided buffer had insufficient capacity. Message encoding is otherwise
-/// infallible.
-#[derive(Copy, Clone, Debug, PartialEq, Eq)]
-pub struct EncodeError {
- required: usize,
- remaining: usize,
-}
-
-impl EncodeError {
- /// Creates a new `EncodeError`.
- pub(crate) fn new(required: usize, remaining: usize) -> EncodeError {
- EncodeError {
- required,
- remaining,
- }
- }
-
- /// Returns the required buffer capacity to encode the message.
- pub fn required_capacity(&self) -> usize {
- self.required
- }
-
- /// Returns the remaining length in the provided buffer at the time of encoding.
- pub fn remaining(&self) -> usize {
- self.remaining
- }
-}
-
-impl fmt::Display for EncodeError {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(
- f,
- "failed to encode Protobuf message; insufficient buffer capacity (required: {}, remaining: {})",
- self.required, self.remaining
- )
- }
-}
-
-#[cfg(feature = "std")]
-impl std::error::Error for EncodeError {}
-
-#[cfg(feature = "std")]
-impl From<EncodeError> for std::io::Error {
- fn from(error: EncodeError) -> std::io::Error {
- std::io::Error::new(std::io::ErrorKind::InvalidInput, error)
- }
-}
-
-/// An error indicating that an unknown enumeration value was encountered.
-///
-/// The Protobuf spec mandates that enumeration value sets are ‘open’, so this
-/// error's value represents an integer value unrecognized by the
-/// presently used enum definition.
-#[derive(Copy, Clone, Debug, PartialEq, Eq)]
-pub struct UnknownEnumValue(pub i32);
-
-impl fmt::Display for UnknownEnumValue {
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "unknown enumeration value {}", self.0)
- }
-}
-
-#[cfg(feature = "std")]
-impl std::error::Error for UnknownEnumValue {}
-
-#[cfg(test)]
-mod test {
- use super::*;
-
- #[test]
- fn test_push() {
- let mut decode_error = DecodeError::new("something failed");
- decode_error.push("Foo bad", "bar.foo");
- decode_error.push("Baz bad", "bar.baz");
-
- assert_eq!(
- decode_error.to_string(),
- "failed to decode Protobuf message: Foo bad.bar.foo: Baz bad.bar.baz: something failed"
- );
- }
-
- #[cfg(feature = "std")]
- #[test]
- fn test_into_std_io_error() {
- let decode_error = DecodeError::new("something failed");
- let std_io_error = std::io::Error::from(decode_error);
-
- assert_eq!(std_io_error.kind(), std::io::ErrorKind::InvalidData);
- assert_eq!(
- std_io_error.to_string(),
- "failed to decode Protobuf message: something failed"
- );
- }
-}
diff --git a/vendor/prost/src/lib.rs b/vendor/prost/src/lib.rs
deleted file mode 100644
index 8f9df5bb..00000000
--- a/vendor/prost/src/lib.rs
+++ /dev/null
@@ -1,42 +0,0 @@
-#![doc(html_root_url = "https://docs.rs/prost/0.13.5")]
-#![cfg_attr(not(feature = "std"), no_std)]
-#![doc = include_str!("../README.md")]
-
-// Re-export the alloc crate for use within derived code.
-#[doc(hidden)]
-pub extern crate alloc;
-
-// Re-export the bytes crate for use within derived code.
-pub use bytes;
-
-mod error;
-mod message;
-mod name;
-mod types;
-
-#[doc(hidden)]
-pub mod encoding;
-
-pub use crate::encoding::length_delimiter::{
- decode_length_delimiter, encode_length_delimiter, length_delimiter_len,
-};
-pub use crate::error::{DecodeError, EncodeError, UnknownEnumValue};
-pub use crate::message::Message;
-pub use crate::name::Name;
-
-// See `encoding::DecodeContext` for more info.
-// 100 is the default recursion limit in the C++ implementation.
-#[cfg(not(feature = "no-recursion-limit"))]
-const RECURSION_LIMIT: u32 = 100;
-
-// Re-export #[derive(Message, Enumeration, Oneof)].
-// Based on serde's equivalent re-export [1], but enabled by default.
-//
-// [1]: https://github.com/serde-rs/serde/blob/v1.0.89/serde/src/lib.rs#L245-L256
-#[cfg(feature = "derive")]
-#[allow(unused_imports)]
-#[macro_use]
-extern crate prost_derive;
-#[cfg(feature = "derive")]
-#[doc(hidden)]
-pub use prost_derive::*;
diff --git a/vendor/prost/src/message.rs b/vendor/prost/src/message.rs
deleted file mode 100644
index ee33eecd..00000000
--- a/vendor/prost/src/message.rs
+++ /dev/null
@@ -1,187 +0,0 @@
-#[cfg(not(feature = "std"))]
-use alloc::boxed::Box;
-#[cfg(not(feature = "std"))]
-use alloc::vec::Vec;
-
-use core::fmt::Debug;
-
-use bytes::{Buf, BufMut};
-
-use crate::encoding::varint::{encode_varint, encoded_len_varint};
-use crate::encoding::wire_type::WireType;
-use crate::encoding::{decode_key, message, DecodeContext};
-use crate::DecodeError;
-use crate::EncodeError;
-
-/// A Protocol Buffers message.
-pub trait Message: Debug + Send + Sync {
- /// Encodes the message to a buffer.
- ///
- /// This method will panic if the buffer has insufficient capacity.
- ///
- /// Meant to be used only by `Message` implementations.
- #[doc(hidden)]
- fn encode_raw(&self, buf: &mut impl BufMut)
- where
- Self: Sized;
-
- /// Decodes a field from a buffer, and merges it into `self`.
- ///
- /// Meant to be used only by `Message` implementations.
- #[doc(hidden)]
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError>
- where
- Self: Sized;
-
- /// Returns the encoded length of the message without a length delimiter.
- fn encoded_len(&self) -> usize;
-
- /// Encodes the message to a buffer.
- ///
- /// An error will be returned if the buffer does not have sufficient capacity.
- fn encode(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>
- where
- Self: Sized,
- {
- let required = self.encoded_len();
- let remaining = buf.remaining_mut();
- if required > remaining {
- return Err(EncodeError::new(required, remaining));
- }
-
- self.encode_raw(buf);
- Ok(())
- }
-
- /// Encodes the message to a newly allocated buffer.
- fn encode_to_vec(&self) -> Vec<u8>
- where
- Self: Sized,
- {
- let mut buf = Vec::with_capacity(self.encoded_len());
-
- self.encode_raw(&mut buf);
- buf
- }
-
- /// Encodes the message with a length-delimiter to a buffer.
- ///
- /// An error will be returned if the buffer does not have sufficient capacity.
- fn encode_length_delimited(&self, buf: &mut impl BufMut) -> Result<(), EncodeError>
- where
- Self: Sized,
- {
- let len = self.encoded_len();
- let required = len + encoded_len_varint(len as u64);
- let remaining = buf.remaining_mut();
- if required > remaining {
- return Err(EncodeError::new(required, remaining));
- }
- encode_varint(len as u64, buf);
- self.encode_raw(buf);
- Ok(())
- }
-
- /// Encodes the message with a length-delimiter to a newly allocated buffer.
- fn encode_length_delimited_to_vec(&self) -> Vec<u8>
- where
- Self: Sized,
- {
- let len = self.encoded_len();
- let mut buf = Vec::with_capacity(len + encoded_len_varint(len as u64));
-
- encode_varint(len as u64, &mut buf);
- self.encode_raw(&mut buf);
- buf
- }
-
- /// Decodes an instance of the message from a buffer.
- ///
- /// The entire buffer will be consumed.
- fn decode(mut buf: impl Buf) -> Result<Self, DecodeError>
- where
- Self: Default,
- {
- let mut message = Self::default();
- Self::merge(&mut message, &mut buf).map(|_| message)
- }
-
- /// Decodes a length-delimited instance of the message from the buffer.
- fn decode_length_delimited(buf: impl Buf) -> Result<Self, DecodeError>
- where
- Self: Default,
- {
- let mut message = Self::default();
- message.merge_length_delimited(buf)?;
- Ok(message)
- }
-
- /// Decodes an instance of the message from a buffer, and merges it into `self`.
- ///
- /// The entire buffer will be consumed.
- fn merge(&mut self, mut buf: impl Buf) -> Result<(), DecodeError>
- where
- Self: Sized,
- {
- let ctx = DecodeContext::default();
- while buf.has_remaining() {
- let (tag, wire_type) = decode_key(&mut buf)?;
- self.merge_field(tag, wire_type, &mut buf, ctx.clone())?;
- }
- Ok(())
- }
-
- /// Decodes a length-delimited instance of the message from buffer, and
- /// merges it into `self`.
- fn merge_length_delimited(&mut self, mut buf: impl Buf) -> Result<(), DecodeError>
- where
- Self: Sized,
- {
- message::merge(
- WireType::LengthDelimited,
- self,
- &mut buf,
- DecodeContext::default(),
- )
- }
-
- /// Clears the message, resetting all fields to their default.
- fn clear(&mut self);
-}
-
-impl<M> Message for Box<M>
-where
- M: Message,
-{
- fn encode_raw(&self, buf: &mut impl BufMut) {
- (**self).encode_raw(buf)
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- (**self).merge_field(tag, wire_type, buf, ctx)
- }
- fn encoded_len(&self) -> usize {
- (**self).encoded_len()
- }
- fn clear(&mut self) {
- (**self).clear()
- }
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- const _MESSAGE_IS_OBJECT_SAFE: Option<&dyn Message> = None;
-}
diff --git a/vendor/prost/src/name.rs b/vendor/prost/src/name.rs
deleted file mode 100644
index 1b5b4a28..00000000
--- a/vendor/prost/src/name.rs
+++ /dev/null
@@ -1,34 +0,0 @@
-//! Support for associating type name information with a [`Message`].
-
-use crate::Message;
-
-#[cfg(not(feature = "std"))]
-use alloc::{format, string::String};
-
-/// Associate a type name with a [`Message`] type.
-pub trait Name: Message {
- /// Simple name for this [`Message`].
- /// This name is the same as it appears in the source .proto file, e.g. `FooBar`.
- const NAME: &'static str;
-
- /// Package name this message type is contained in. They are domain-like
- /// and delimited by `.`, e.g. `google.protobuf`.
- const PACKAGE: &'static str;
-
- /// Fully-qualified unique name for this [`Message`].
- /// It's prefixed with the package name and names of any parent messages,
- /// e.g. `google.rpc.BadRequest.FieldViolation`.
- /// By default, this is the package name followed by the message name.
- /// Fully-qualified names must be unique within a domain of Type URLs.
- fn full_name() -> String {
- format!("{}.{}", Self::PACKAGE, Self::NAME)
- }
-
- /// Type URL for this [`Message`], which by default is the full name with a
- /// leading slash, but may also include a leading domain name, e.g.
- /// `type.googleapis.com/google.profile.Person`.
- /// This can be used when serializing into the `google.protobuf.Any` type.
- fn type_url() -> String {
- format!("/{}", Self::full_name())
- }
-}
diff --git a/vendor/prost/src/types.rs b/vendor/prost/src/types.rs
deleted file mode 100644
index 8300a710..00000000
--- a/vendor/prost/src/types.rs
+++ /dev/null
@@ -1,570 +0,0 @@
-//! Protocol Buffers well-known wrapper types.
-//!
-//! This module provides implementations of `Message` for Rust standard library types which
-//! correspond to a Protobuf well-known wrapper type. The remaining well-known types are defined in
-//! the `prost-types` crate in order to avoid a cyclic dependency between `prost` and
-//! `prost-build`.
-
-use alloc::format;
-use alloc::string::String;
-use alloc::vec::Vec;
-
-use ::bytes::{Buf, BufMut, Bytes};
-
-use crate::encoding::wire_type::WireType;
-use crate::{
- encoding::{
- bool, bytes, double, float, int32, int64, skip_field, string, uint32, uint64, DecodeContext,
- },
- DecodeError, Message, Name,
-};
-
-/// `google.protobuf.BoolValue`
-impl Message for bool {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if *self {
- bool::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- bool::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if *self {
- 2
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- *self = false;
- }
-}
-
-/// `google.protobuf.BoolValue`
-impl Name for bool {
- const NAME: &'static str = "BoolValue";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.UInt32Value`
-impl Message for u32 {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if *self != 0 {
- uint32::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- uint32::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if *self != 0 {
- uint32::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- *self = 0;
- }
-}
-
-/// `google.protobuf.UInt32Value`
-impl Name for u32 {
- const NAME: &'static str = "UInt32Value";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.UInt64Value`
-impl Message for u64 {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if *self != 0 {
- uint64::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- uint64::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if *self != 0 {
- uint64::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- *self = 0;
- }
-}
-
-/// `google.protobuf.UInt64Value`
-impl Name for u64 {
- const NAME: &'static str = "UInt64Value";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.Int32Value`
-impl Message for i32 {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if *self != 0 {
- int32::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- int32::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if *self != 0 {
- int32::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- *self = 0;
- }
-}
-
-/// `google.protobuf.Int32Value`
-impl Name for i32 {
- const NAME: &'static str = "Int32Value";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.Int64Value`
-impl Message for i64 {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if *self != 0 {
- int64::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- int64::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if *self != 0 {
- int64::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- *self = 0;
- }
-}
-
-/// `google.protobuf.Int64Value`
-impl Name for i64 {
- const NAME: &'static str = "Int64Value";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.FloatValue`
-impl Message for f32 {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if *self != 0.0 {
- float::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- float::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if *self != 0.0 {
- float::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- *self = 0.0;
- }
-}
-
-/// `google.protobuf.FloatValue`
-impl Name for f32 {
- const NAME: &'static str = "FloatValue";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.DoubleValue`
-impl Message for f64 {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if *self != 0.0 {
- double::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- double::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if *self != 0.0 {
- double::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- *self = 0.0;
- }
-}
-
-/// `google.protobuf.DoubleValue`
-impl Name for f64 {
- const NAME: &'static str = "DoubleValue";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.StringValue`
-impl Message for String {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if !self.is_empty() {
- string::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- string::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if !self.is_empty() {
- string::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- self.clear();
- }
-}
-
-/// `google.protobuf.StringValue`
-impl Name for String {
- const NAME: &'static str = "StringValue";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.BytesValue`
-impl Message for Vec<u8> {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if !self.is_empty() {
- bytes::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- bytes::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if !self.is_empty() {
- bytes::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- self.clear();
- }
-}
-
-/// `google.protobuf.BytesValue`
-impl Name for Vec<u8> {
- const NAME: &'static str = "BytesValue";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.BytesValue`
-impl Message for Bytes {
- fn encode_raw(&self, buf: &mut impl BufMut) {
- if !self.is_empty() {
- bytes::encode(1, self, buf)
- }
- }
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- if tag == 1 {
- bytes::merge(wire_type, self, buf, ctx)
- } else {
- skip_field(wire_type, tag, buf, ctx)
- }
- }
- fn encoded_len(&self) -> usize {
- if !self.is_empty() {
- bytes::encoded_len(1, self)
- } else {
- 0
- }
- }
- fn clear(&mut self) {
- self.clear();
- }
-}
-
-/// `google.protobuf.BytesValue`
-impl Name for Bytes {
- const NAME: &'static str = "BytesValue";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// `google.protobuf.Empty`
-impl Message for () {
- fn encode_raw(&self, _buf: &mut impl BufMut) {}
- fn merge_field(
- &mut self,
- tag: u32,
- wire_type: WireType,
- buf: &mut impl Buf,
- ctx: DecodeContext,
- ) -> Result<(), DecodeError> {
- skip_field(wire_type, tag, buf, ctx)
- }
- fn encoded_len(&self) -> usize {
- 0
- }
- fn clear(&mut self) {}
-}
-
-/// `google.protobuf.Empty`
-impl Name for () {
- const NAME: &'static str = "Empty";
- const PACKAGE: &'static str = "google.protobuf";
-
- fn type_url() -> String {
- googleapis_type_url_for::<Self>()
- }
-}
-
-/// Compute the type URL for the given `google.protobuf` type, using `type.googleapis.com` as the
-/// authority for the URL.
-fn googleapis_type_url_for<T: Name>() -> String {
- format!("type.googleapis.com/{}.{}", T::PACKAGE, T::NAME)
-}
-
-#[cfg(test)]
-mod tests {
- use super::*;
-
- #[test]
- fn test_impl_name() {
- assert_eq!("BoolValue", bool::NAME);
- assert_eq!("google.protobuf", bool::PACKAGE);
- assert_eq!("google.protobuf.BoolValue", bool::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.BoolValue",
- bool::type_url()
- );
-
- assert_eq!("UInt32Value", u32::NAME);
- assert_eq!("google.protobuf", u32::PACKAGE);
- assert_eq!("google.protobuf.UInt32Value", u32::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.UInt32Value",
- u32::type_url()
- );
-
- assert_eq!("UInt64Value", u64::NAME);
- assert_eq!("google.protobuf", u64::PACKAGE);
- assert_eq!("google.protobuf.UInt64Value", u64::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.UInt64Value",
- u64::type_url()
- );
-
- assert_eq!("Int32Value", i32::NAME);
- assert_eq!("google.protobuf", i32::PACKAGE);
- assert_eq!("google.protobuf.Int32Value", i32::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.Int32Value",
- i32::type_url()
- );
-
- assert_eq!("Int64Value", i64::NAME);
- assert_eq!("google.protobuf", i64::PACKAGE);
- assert_eq!("google.protobuf.Int64Value", i64::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.Int64Value",
- i64::type_url()
- );
-
- assert_eq!("FloatValue", f32::NAME);
- assert_eq!("google.protobuf", f32::PACKAGE);
- assert_eq!("google.protobuf.FloatValue", f32::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.FloatValue",
- f32::type_url()
- );
-
- assert_eq!("DoubleValue", f64::NAME);
- assert_eq!("google.protobuf", f64::PACKAGE);
- assert_eq!("google.protobuf.DoubleValue", f64::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.DoubleValue",
- f64::type_url()
- );
-
- assert_eq!("StringValue", String::NAME);
- assert_eq!("google.protobuf", String::PACKAGE);
- assert_eq!("google.protobuf.StringValue", String::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.StringValue",
- String::type_url()
- );
-
- assert_eq!("BytesValue", Vec::<u8>::NAME);
- assert_eq!("google.protobuf", Vec::<u8>::PACKAGE);
- assert_eq!("google.protobuf.BytesValue", Vec::<u8>::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.BytesValue",
- Vec::<u8>::type_url()
- );
-
- assert_eq!("BytesValue", Bytes::NAME);
- assert_eq!("google.protobuf", Bytes::PACKAGE);
- assert_eq!("google.protobuf.BytesValue", Bytes::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.BytesValue",
- Bytes::type_url()
- );
-
- assert_eq!("Empty", <()>::NAME);
- assert_eq!("google.protobuf", <()>::PACKAGE);
- assert_eq!("google.protobuf.Empty", <()>::full_name());
- assert_eq!(
- "type.googleapis.com/google.protobuf.Empty",
- <()>::type_url()
- );
- }
-}