// Protocol Buffers - Google's data interchange format // Copyright 2023 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 use crate::__internal::Private; use std::{ error::Error, fmt::{Debug, Display}, marker::PhantomData, }; /// Implemented by all generated enum types. /// /// # Safety /// - A `RepeatedView` or `RepeatedMut` must have the same internal /// representation as erased enums in the runtime. /// - For C++, this is `proto2::RepeatedField` /// - For UPB, this is an array compatible with `int32` pub unsafe trait Enum: TryFrom { /// The name of the enum. const NAME: &'static str; /// Returns `true` if the given numeric value matches one of the `Self`'s /// defined values. /// /// If `Self` is a closed enum, then `TryFrom` for `value` succeeds if /// and only if this function returns `true`. fn is_known(value: i32) -> bool; } /// An integer value wasn't known for an enum while converting. pub struct UnknownEnumValue(i32, PhantomData); impl UnknownEnumValue { #[doc(hidden)] pub fn new(_private: Private, unknown_value: i32) -> Self { Self(unknown_value, PhantomData) } } impl Debug for UnknownEnumValue { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_tuple("UnknownEnumValue").field(&self.0).finish() } } impl Display for UnknownEnumValue { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let val = self.0; let enum_name = T::NAME; write!(f, "{val} is not a known value for {enum_name}") } } impl Error for UnknownEnumValue {}