Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.5 KiB
77 lines
2.5 KiB
// 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<T> { |
|
/// The field is set; it is present in the serialized message. |
|
/// |
|
/// - For an `_opt()` accessor, this contains a `View<impl Proxied>`. |
|
/// - 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(T), |
|
|
|
/// The field is unset; it is absent in the serialized message. |
|
/// |
|
/// - For an `_opt()` accessor, this contains a `View<impl Proxied>` 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(T), |
|
} |
|
|
|
impl<T> Optional<T> { |
|
/// 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<T>` 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) } |
|
} |
|
|
|
/// Converts into an `Option` of the set value, ignoring any unset value. |
|
pub fn into_option(self) -> Option<T> { |
|
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<T> From<Optional<T>> for Option<T> { |
|
fn from(x: Optional<T>) -> Option<T> { |
|
x.into_option() |
|
} |
|
}
|
|
|