| // 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<T>` for a repeated extension. | |
| pub struct ExtensionId<Extendee, T: Proxied> { | |
| number: u32, | |
| pub(crate) inner: InnerExtensionId, | |
| pub(crate) default: Option<View<'static, T>>, | |
| phantom: PhantomData<Extendee>, | |
| } | |
| impl<Extendee, T: Proxied> ExtensionId<Extendee, T> { | |
| 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<Extendee, T: Proxied>( | |
| _private: Private, | |
| number: u32, | |
| default: View<'static, T>, | |
| inner: InnerExtensionId, | |
| ) -> ExtensionId<Extendee, T> { | |
| ExtensionId { number, inner, default: Some(default), phantom: PhantomData } | |
| } | |
| // Repeated and message extension IDs do not have defaults. | |
| pub const fn new_repeated_extension_id<Extendee, T: ProxiedInRepeated>( | |
| _private: Private, | |
| number: u32, | |
| inner: InnerExtensionId, | |
| ) -> ExtensionId<Extendee, Repeated<T>> { | |
| ExtensionId { number, inner, default: None, phantom: PhantomData } | |
| } | |
| pub const fn new_message_extension_id<Extendee, T: Message>( | |
| _private: Private, | |
| number: u32, | |
| inner: InnerExtensionId, | |
| ) -> ExtensionId<Extendee, T> { | |
| ExtensionId { number, inner, default: None, phantom: PhantomData } | |
| } | |
| #[doc(hidden)] | |
| pub trait ExtHas<Msg: Message> { | |
| fn has(&self, _private: Private, msg: impl AsView<Proxied = Msg>) -> bool; | |
| } | |
| #[doc(hidden)] | |
| pub trait ExtClear<Msg: Message> { | |
| fn clear(&self, _private: Private, msg: impl AsMut<MutProxied = Msg>); | |
| } | |
| #[doc(hidden)] | |
| pub trait ExtAccess<Extendee: Message, T: Proxied, Tag> { | |
| fn get<'msg>( | |
| &self, | |
| _private: Private, | |
| msg: impl IntoView<'msg, Proxied = Extendee>, | |
| ) -> View<'msg, T>; | |
| fn set( | |
| &self, | |
| _private: Private, | |
| msg: impl AsMut<MutProxied = Extendee>, | |
| value: impl IntoProxied<T>, | |
| ); | |
| } | |
| #[doc(hidden)] | |
| pub trait ExtGetMut<Extendee: Message, T: MutProxied, Tag> { | |
| fn get_mut<'msg>( | |
| &self, | |
| _private: Private, | |
| msg: impl IntoMut<'msg, MutProxied = Extendee>, | |
| ) -> Mut<'msg, T>; | |
| } | |
| impl<Extendee: Message, T: Proxied + crate::codegen_traits::EntityType> ExtensionId<Extendee, T> { | |
| pub fn has(&self, msg: impl AsView<Proxied = Extendee>) -> bool | |
| where | |
| Self: ExtHas<Extendee>, | |
| { | |
| ExtHas::has(self, Private, msg) | |
| } | |
| pub fn get<'msg>(&self, msg: impl IntoView<'msg, Proxied = Extendee>) -> View<'msg, T> | |
| where | |
| Self: ExtAccess<Extendee, T, <T as crate::codegen_traits::EntityType>::Tag>, | |
| { | |
| ExtAccess::get(self, Private, msg) | |
| } | |
| pub fn clear(&self, mut msg: impl AsMut<MutProxied = Extendee>) | |
| where | |
| Self: ExtClear<Extendee>, | |
| { | |
| ExtClear::clear(self, Private, msg) | |
| } | |
| pub fn set(&self, mut msg: impl AsMut<MutProxied = Extendee>, value: impl IntoProxied<T>) | |
| where | |
| Self: ExtAccess<Extendee, T, <T as crate::codegen_traits::EntityType>::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<Extendee, T, <T as crate::codegen_traits::EntityType>::Tag>, | |
| { | |
| ExtGetMut::get_mut(self, Private, msg) | |
| } | |
| } |