//! Utilities to support "extension" fields. //! //! This is a stopgap implementation, it only allows to fetch basic singular values, //! and that's it. Anything similar to extension registry is not implemented yet. //! //! Extensions are [described in the official protobuf documentation][exts]. //! //! [exts]: https://developers.google.com/protocol-buffers/docs/proto#extensions use std::marker::PhantomData; use crate::descriptor::field_descriptor_proto::Type; use crate::reflect::runtime_types::RuntimeTypeTrait; use crate::reflect::ProtobufValue; use crate::Message; /// Optional ext field /// /// This is initialized from generated code, do not instantiate directly. pub struct ExtFieldOptional { /// Extension field number. field_number: u32, /// Extension field type. field_type: Type, /// Marker phantom: PhantomData<(M, T)>, } /// Repeated ext field /// /// This is initialized from generated code, do not instantiate directly. pub struct ExtFieldRepeated { /// Extension field number #[allow(dead_code)] field_number: u32, /// Field type. #[allow(dead_code)] field_type: Type, /// Extension field number phantom: PhantomData<(M, V)>, } impl ExtFieldOptional { /// Constructor. Called from generated code. pub const fn new(field_number: u32, field_type: Type) -> Self { ExtFieldOptional { field_number, field_type, phantom: PhantomData, } } } impl ExtFieldOptional { /// Get a copy of value from a message. /// /// Extension data is stored in [`UnknownFields`](crate::UnknownFields). pub fn get(&self, m: &M) -> Option { m.unknown_fields() .get(self.field_number) .and_then(|u| V::RuntimeType::get_from_unknown(u, self.field_type)) } } impl ExtFieldRepeated { /// Constructor. Called from generated code. pub const fn new(field_number: u32, field_type: Type) -> Self { ExtFieldRepeated { field_number, field_type, phantom: PhantomData, } } } impl ExtFieldRepeated { /// Get a copy of value from a message (**not implemented**). pub fn get(&self, _m: &M) -> Vec { unimplemented!("extension fields implementation in rust-protobuf is stopgap") } }