base/
optional.rs

1/// FFI-safe variant of [`Option`].
2///
3/// Implements the [`From`] and [`Into`] traits for easy conversion to and from [`Option`].
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
5#[repr(C)]
6pub enum Optional<T> {
7   /// Some value `T`.
8   Some(T),
9
10   /// No value.
11   None,
12}
13
14impl<T> Optional<T> {
15   pub fn into_option(self) -> Option<T> {
16      self.into()
17   }
18
19   pub const fn as_ref(&self) -> Option<&T> {
20      match self {
21         Self::Some(x) => Option::Some(x),
22         Self::None => Option::None,
23      }
24   }
25
26   /// Converts from `&mut Optional<T>` to `Option<&mut T>`.
27   ///
28   /// For convenience, this method directly performs the conversion to the standard
29   /// [`Option`] type.
30   pub fn as_mut(&mut self) -> Option<&mut T> {
31      match self {
32         Self::Some(x) => Option::Some(x),
33         Self::None => Option::None,
34      }
35   }
36}
37
38impl<T> From<Option<T>> for Optional<T> {
39   fn from(v: Option<T>) -> Optional<T> {
40      match v {
41         Some(v) => Optional::Some(v),
42         None => Optional::None,
43      }
44   }
45}
46
47impl<T> From<Optional<T>> for Option<T> {
48   fn from(value: Optional<T>) -> Self {
49      match value {
50         Optional::Some(value) => Option::Some(value),
51         Optional::None => Option::None,
52      }
53   }
54}