// 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 //! Items specific to `optional` fields. #![allow(dead_code)] #![allow(unused)] use crate::__internal::Private; use crate::{Mut, MutProxied, MutProxy, Proxied, View, ViewProxy}; use std::convert::{AsMut, AsRef}; use std::fmt::{self, Debug}; use std::panic; use std::ptr; /// A protobuf value from a field that may not be set. /// /// This can be pattern matched with `match` or `if let` to determine if the /// field is set and access the field data. /// /// Two `Optional`s are equal if they match both presence and the field values. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Optional { /// The field is set; it is present in the serialized message. /// /// - For an `_opt()` accessor, this contains a `View`. /// - For a `_mut()` accessor, this contains a [`PresentField`] that can be /// used to access the current value, convert to [`Mut`], clear presence, /// or set a new value. Set(SetVal), /// The field is unset; it is absent in the serialized message. /// /// - For an `_opt()` accessor, this contains a `View` with /// the default value. /// - For a `_mut()` accessor, this contains an [`AbsentField`] that can be /// used to access the default or set a new value. Unset(UnsetVal), } impl Optional { /// Gets the field value, ignoring whether it was set or not. pub fn into_inner(self) -> T { match self { Optional::Set(x) | Optional::Unset(x) => x, } } /// Constructs an `Optional` with a `T` value and presence bit. pub fn new(val: T, is_set: bool) -> Self { if is_set { Optional::Set(val) } else { Optional::Unset(val) } } } impl Optional { /// Converts into an `Option` of the set value, ignoring any unset value. pub fn into_option(self) -> Option { if let Optional::Set(x) = self { Some(x) } else { None } } /// Returns if the field is set. pub fn is_set(&self) -> bool { matches!(self, Optional::Set(_)) } /// Returns if the field is unset. pub fn is_unset(&self) -> bool { matches!(self, Optional::Unset(_)) } } impl From> for Option { fn from(x: Optional) -> Option { x.into_option() } }