Skip to main content

PickFirst

Struct PickFirst 

Source
pub struct PickFirst<A>(/* private fields */);
Expand description

Tries adapters in order until one of them accepts the value.

The adapters are given as a tuple of two to four adapters, _ stands for Same. When deserializing, the value is delivered to the adapters in order and the first one that accepts it wins. Values other than atoms are recorded and replayed for every adapter (like for untagged enums, see Recording), which keeps their source locations. If no adapter accepts the value, the error of the first adapter is reported. Missing values are handled by the first adapter. Serialization uses the first adapter.

The most common use is to accept a value in more than one form, like numbers that are also sent as strings:

use deser::adapters::{DisplayFromStr, PickFirst};
use deser::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug, PartialEq)]
pub struct Item {
    #[deser(as = PickFirst<(_, DisplayFromStr)>)]
    id: u64,
}

let a: Item = deser_json::from_str(r#"{"id": 42}"#).unwrap();
let b: Item = deser_json::from_str(r#"{"id": "42"}"#).unwrap();
assert_eq!(a, b);
assert_eq!(deser_json::to_string(&b).unwrap(), r#"{"id":42}"#);

Trait Implementations§

Source§

impl<'de, T: Send, A1: Deserialize<'de, T>, A2: Deserialize<'de, T>> Deserialize<'de, T> for PickFirst<(A1, A2)>

Source§

fn deserialize_into<'out>( out: &'out mut Option<T>, state: &mut State, ) -> SinkHandle<'out, 'de>

Creates a sink that deserializes the value into the given slot. Read more
Source§

fn expecting() -> Cow<'static, str>

Returns what the value expects, for error messages. Read more
Source§

fn initial_value() -> Option<T>

Provides the value of a missing struct field. Read more
Source§

fn deserialize_atom( slot: &mut Slot<T, Self>, atom: Atom<'_>, state: &mut State, ) -> Result<(), Error>

Deserializes an atom into the slot. Read more
Source§

fn deserialize_borrowed_atom( slot: &mut Slot<T, Self>, atom: Atom<'de>, state: &mut State, ) -> Result<(), Error>

Deserializes an atom that borrows from the data being deserialized into the slot. Read more
Source§

fn describe_type(d: &mut dyn Describe)

Describes the Rust shape of the type. Read more
Source§

fn deserialize_update<'out>( value: &'out mut T, state: &mut State, ) -> SinkHandle<'out, 'de>

Creates a sink that updates an existing value. Read more
Source§

impl<'de, T: Send, A1: Deserialize<'de, T>, A2: Deserialize<'de, T>, A3: Deserialize<'de, T>> Deserialize<'de, T> for PickFirst<(A1, A2, A3)>

Source§

fn deserialize_into<'out>( out: &'out mut Option<T>, state: &mut State, ) -> SinkHandle<'out, 'de>

Creates a sink that deserializes the value into the given slot. Read more
Source§

fn expecting() -> Cow<'static, str>

Returns what the value expects, for error messages. Read more
Source§

fn initial_value() -> Option<T>

Provides the value of a missing struct field. Read more
Source§

fn deserialize_atom( slot: &mut Slot<T, Self>, atom: Atom<'_>, state: &mut State, ) -> Result<(), Error>

Deserializes an atom into the slot. Read more
Source§

fn deserialize_borrowed_atom( slot: &mut Slot<T, Self>, atom: Atom<'de>, state: &mut State, ) -> Result<(), Error>

Deserializes an atom that borrows from the data being deserialized into the slot. Read more
Source§

fn describe_type(d: &mut dyn Describe)

Describes the Rust shape of the type. Read more
Source§

fn deserialize_update<'out>( value: &'out mut T, state: &mut State, ) -> SinkHandle<'out, 'de>

Creates a sink that updates an existing value. Read more
Source§

impl<'de, T: Send, A1: Deserialize<'de, T>, A2: Deserialize<'de, T>, A3: Deserialize<'de, T>, A4: Deserialize<'de, T>> Deserialize<'de, T> for PickFirst<(A1, A2, A3, A4)>

Source§

fn deserialize_into<'out>( out: &'out mut Option<T>, state: &mut State, ) -> SinkHandle<'out, 'de>

Creates a sink that deserializes the value into the given slot. Read more
Source§

fn expecting() -> Cow<'static, str>

Returns what the value expects, for error messages. Read more
Source§

fn initial_value() -> Option<T>

Provides the value of a missing struct field. Read more
Source§

fn deserialize_atom( slot: &mut Slot<T, Self>, atom: Atom<'_>, state: &mut State, ) -> Result<(), Error>

Deserializes an atom into the slot. Read more
Source§

fn deserialize_borrowed_atom( slot: &mut Slot<T, Self>, atom: Atom<'de>, state: &mut State, ) -> Result<(), Error>

Deserializes an atom that borrows from the data being deserialized into the slot. Read more
Source§

fn describe_type(d: &mut dyn Describe)

Describes the Rust shape of the type. Read more
Source§

fn deserialize_update<'out>( value: &'out mut T, state: &mut State, ) -> SinkHandle<'out, 'de>

Creates a sink that updates an existing value. Read more
Source§

impl<T: ?Sized, A1: Serialize<T>, A2> Serialize<T> for PickFirst<(A1, A2)>

Source§

fn serialize<'a>(value: &'a T, state: &mut State) -> Result<Emit<'a>, Error>

Serializes the value.
Source§

fn finish(value: &T, state: &mut State) -> Result<(), Error>

Invoked after the serialization finished. Read more
Source§

fn is_optional(value: &T) -> bool

Checks if the value represents an optional value. Read more
Source§

fn container_shape(value: &T) -> ContainerShape

Returns the shape of the value if it’s a map or sequence. Read more
Source§

fn describe(value: &T, d: &mut dyn Describe)

Describes the Rust shape of the value. Read more
Source§

impl<T: ?Sized, A1: Serialize<T>, A2, A3> Serialize<T> for PickFirst<(A1, A2, A3)>

Source§

fn serialize<'a>(value: &'a T, state: &mut State) -> Result<Emit<'a>, Error>

Serializes the value.
Source§

fn finish(value: &T, state: &mut State) -> Result<(), Error>

Invoked after the serialization finished. Read more
Source§

fn is_optional(value: &T) -> bool

Checks if the value represents an optional value. Read more
Source§

fn container_shape(value: &T) -> ContainerShape

Returns the shape of the value if it’s a map or sequence. Read more
Source§

fn describe(value: &T, d: &mut dyn Describe)

Describes the Rust shape of the value. Read more
Source§

impl<T: ?Sized, A1: Serialize<T>, A2, A3, A4> Serialize<T> for PickFirst<(A1, A2, A3, A4)>

Source§

fn serialize<'a>(value: &'a T, state: &mut State) -> Result<Emit<'a>, Error>

Serializes the value.
Source§

fn finish(value: &T, state: &mut State) -> Result<(), Error>

Invoked after the serialization finished. Read more
Source§

fn is_optional(value: &T) -> bool

Checks if the value represents an optional value. Read more
Source§

fn container_shape(value: &T) -> ContainerShape

Returns the shape of the value if it’s a map or sequence. Read more
Source§

fn describe(value: &T, d: &mut dyn Describe)

Describes the Rust shape of the value. Read more

Auto Trait Implementations§

§

impl<A> Freeze for PickFirst<A>
where PhantomData<fn() -> A>: Freeze,

§

impl<A> RefUnwindSafe for PickFirst<A>
where PhantomData<fn() -> A>: RefUnwindSafe,

§

impl<A> Send for PickFirst<A>
where PhantomData<fn() -> A>: Send,

§

impl<A> Sync for PickFirst<A>
where PhantomData<fn() -> A>: Sync,

§

impl<A> Unpin for PickFirst<A>
where PhantomData<fn() -> A>: Unpin,

§

impl<A> UnsafeUnpin for PickFirst<A>
where PhantomData<fn() -> A>: UnsafeUnpin,

§

impl<A> UnwindSafe for PickFirst<A>
where PhantomData<fn() -> A>: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.