pub enum Either<A, B> {
Left(A),
Right(B),
}
Expand description
(De)serializes as either a magic value A
or any other deserializable value
B
.
An Either<A, B>
deserializes as either an A
or B
, whichever succeeds
first.
The usual Either
implementation or an “untagged” enum does not allow its
internal values to provide hints to the deserializer. These hints are
required for magic values to work. By contrast, this Either
does provide
the appropriate hints.
§Example
use serde::{Serialize, Deserialize};
use figment::{Figment, value::magic::{Either, RelativePathBuf, Tagged}};
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct Config {
int_or_str: Either<Tagged<usize>, String>,
path_or_bytes: Either<RelativePathBuf, Vec<u8>>,
}
fn figment<A: Serialize, B: Serialize>(a: A, b: B) -> Figment {
Figment::from(("int_or_str", a)).merge(("path_or_bytes", b))
}
let config: Config = figment(10, "/a/b").extract().unwrap();
assert_eq!(config.int_or_str, Either::Left(10.into()));
assert_eq!(config.path_or_bytes, Either::Left("/a/b".into()));
let config: Config = figment("hi", "c/d").extract().unwrap();
assert_eq!(config.int_or_str, Either::Right("hi".into()));
assert_eq!(config.path_or_bytes, Either::Left("c/d".into()));
let config: Config = figment(123, &[1, 2, 3]).extract().unwrap();
assert_eq!(config.int_or_str, Either::Left(123.into()));
assert_eq!(config.path_or_bytes, Either::Right(vec![1, 2, 3].into()));
let config: Config = figment("boo!", &[4, 5, 6]).extract().unwrap();
assert_eq!(config.int_or_str, Either::Right("boo!".into()));
assert_eq!(config.path_or_bytes, Either::Right(vec![4, 5, 6].into()));
let config: Config = Figment::from(figment::providers::Serialized::defaults(Config {
int_or_str: Either::Left(10.into()),
path_or_bytes: Either::Left("a/b/c".into()),
})).extract().unwrap();
assert_eq!(config.int_or_str, Either::Left(10.into()));
assert_eq!(config.path_or_bytes, Either::Left("a/b/c".into()));
let config: Config = Figment::from(figment::providers::Serialized::defaults(Config {
int_or_str: Either::Right("hi".into()),
path_or_bytes: Either::Right(vec![3, 7, 13]),
})).extract().unwrap();
assert_eq!(config.int_or_str, Either::Right("hi".into()));
assert_eq!(config.path_or_bytes, Either::Right(vec![3, 7, 13]));
Variants§
Trait Implementations§
Source§impl<'de: 'b, 'b, A, B> Deserialize<'de> for Either<A, B>where
A: Magic,
B: Deserialize<'b>,
impl<'de: 'b, 'b, A, B> Deserialize<'de> for Either<A, B>where
A: Magic,
B: Deserialize<'b>,
Source§fn deserialize<D>(de: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(de: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Source§impl<A: Ord, B: Ord> Ord for Either<A, B>
impl<A: Ord, B: Ord> Ord for Either<A, B>
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Compares and returns the maximum of two values. Read more
Source§impl<A: PartialOrd, B: PartialOrd> PartialOrd for Either<A, B>
impl<A: PartialOrd, B: PartialOrd> PartialOrd for Either<A, B>
impl<A: Eq, B: Eq> Eq for Either<A, B>
impl<A, B> StructuralPartialEq for Either<A, B>
Auto Trait Implementations§
impl<A, B> Freeze for Either<A, B>
impl<A, B> RefUnwindSafe for Either<A, B>where
A: RefUnwindSafe,
B: RefUnwindSafe,
impl<A, B> Send for Either<A, B>
impl<A, B> Sync for Either<A, B>
impl<A, B> Unpin for Either<A, B>
impl<A, B> UnwindSafe for Either<A, B>where
A: UnwindSafe,
B: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to
key
and return true
if they are equal.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Layout§
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.