mirror of
https://github.com/protocolbuffers/protobuf
synced 2026-08-26 02:23:14 -04:00
136 lines
4.2 KiB
Rust
136 lines
4.2 KiB
Rust
// 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)
|
|
}
|
|
}
|