// Protocol Buffers - Google's data interchange format // Copyright 2026 Google LLC. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file or at // https://developers.google.com/open-source/licenses/bsd #![allow(dead_code)] #![allow(unused)] use crate::__internal::runtime::InnerExtensionId; use crate::__internal::{EntityType, Private, SealedInternal}; use crate::codegen_traits::entity_tag::*; use crate::{ AsMut, AsView, Enum, IntoMut, IntoProxied, IntoView, Message, Mut, MutProxied, ProtoBytes, ProtoString, Proxied, ProxiedInRepeated, Repeated, View, }; use std::marker::PhantomData; /// A unique identifier for an extension field. Values of this type are emitted into the generated /// code and used to access extension fields. /// /// The type parameter `Extendee` is the message type that the extension field is extending. /// /// The type parameter `T` defines the kind of extension field: either `T` for a singular extension /// or `Repeated` for a repeated extension. pub struct ExtensionId { number: u32, pub(crate) inner: InnerExtensionId, pub(crate) default: Option>, phantom: PhantomData, } impl ExtensionId { pub const fn number(&self) -> u32 { self.number } } // The "public" API (public to generated code) for creating extension IDs. pub const fn new_extension_id( _private: Private, number: u32, default: View<'static, T>, inner: InnerExtensionId, ) -> ExtensionId { ExtensionId { number, inner, default: Some(default), phantom: PhantomData } } // Repeated and message extension IDs do not have defaults. pub const fn new_repeated_extension_id( _private: Private, number: u32, inner: InnerExtensionId, ) -> ExtensionId> { ExtensionId { number, inner, default: None, phantom: PhantomData } } pub const fn new_message_extension_id( _private: Private, number: u32, inner: InnerExtensionId, ) -> ExtensionId { ExtensionId { number, inner, default: None, phantom: PhantomData } } #[doc(hidden)] pub trait ExtHas { fn has(&self, _private: Private, msg: impl AsView) -> bool; } #[doc(hidden)] pub trait ExtClear { fn clear(&self, _private: Private, msg: impl AsMut); } #[doc(hidden)] pub trait ExtAccess { fn get<'msg>( &self, _private: Private, msg: impl IntoView<'msg, Proxied = Extendee>, ) -> View<'msg, T>; fn set( &self, _private: Private, msg: impl AsMut, value: impl IntoProxied, ); } #[doc(hidden)] pub trait ExtGetMut { fn get_mut<'msg>( &self, _private: Private, msg: impl IntoMut<'msg, MutProxied = Extendee>, ) -> Mut<'msg, T>; } impl ExtensionId { pub fn has(&self, msg: impl AsView) -> bool where Self: ExtHas, { ExtHas::has(self, Private, msg) } pub fn get<'msg>(&self, msg: impl IntoView<'msg, Proxied = Extendee>) -> View<'msg, T> where Self: ExtAccess::Tag>, { ExtAccess::get(self, Private, msg) } pub fn clear(&self, mut msg: impl AsMut) where Self: ExtClear, { ExtClear::clear(self, Private, msg) } pub fn set(&self, mut msg: impl AsMut, value: impl IntoProxied) where Self: ExtAccess::Tag>, { ExtAccess::set(self, Private, msg, value) } pub fn get_mut<'msg>(&self, msg: impl IntoMut<'msg, MutProxied = Extendee>) -> Mut<'msg, T> where T: MutProxied, Self: ExtGetMut::Tag>, { ExtGetMut::get_mut(self, Private, msg) } }