Struct TryFromIntoRef

Source
pub struct TryFromIntoRef<T>(/* private fields */);
Expand description

Serialize a reference value by converting to/from a proxy type with serde support.

This adapter serializes a type O by converting it into a second type T and serializing T. Deserializing works analogue, by deserializing a T and then converting into O.

struct S {
    #[serde_as(as = "TryFromIntoRef<T>")]
    value: O,
}

For serialization O needs to be for<'a> &'a O: TryInto<T>. For deserialization the opposite T: TryInto<O> is required. In both cases the TryInto::Error type must implement Display.

Note: FromIntoRef is the more specialized version of this adapter which uses the infallible Into trait instead. TryFromIntoRef is strictly more general and can also be used where FromIntoRef is applicable. The example shows a use case, when only the deserialization behavior is fallible, but not serializing.

§Example

#[derive(Debug, PartialEq)]
enum Boollike {
    True,
    False,
}

impl From<Boollike> for u8 { ... }
impl TryFrom<u8> for Boollike {
    type Error = String;
    fn try_from(v: u8) -> Result<Self, Self::Error> {
        match v {
            0 => Ok(Boollike::False),
            1 => Ok(Boollike::True),
            _ => Err(format!("Boolikes can only be constructed from 0 or 1 but found {}", v))
        }
    }
}

#[serde_as]
#[derive(Deserialize, Serialize)]
struct Data {
    #[serde_as(as = "TryFromIntoRef<u8>")]
    b: Boollike,
}
let data = Data {
    b: Boollike::True,
};

// Define our expected JSON form
let j = json!({
    "b": 1,
});
// Ensure serialization and deserialization produce the expected results
assert_eq!(j, serde_json::to_value(&data).unwrap());
assert_eq!(data, serde_json::from_value(j).unwrap());

// Numbers besides 0 or 1 should be an error
let j = json!({
    "b": 2,
});
assert_eq!("Boolikes can only be constructed from 0 or 1 but found 2", serde_json::from_value::<Data>(j).unwrap_err().to_string());

Trait Implementations§

Source§

impl<'de, T, U> DeserializeAs<'de, T> for TryFromIntoRef<U>
where U: TryInto<T> + Deserialize<'de>, <U as TryInto<T>>::Error: Display,

Source§

fn deserialize_as<D>( deserializer: D, ) -> Result<T, <D as Deserializer<'de>>::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer.
Source§

impl<T, U> SerializeAs<T> for TryFromIntoRef<U>
where &'a T: for<'a> TryInto<U>, <&'a T as TryInto<U>>::Error: for<'a> Display, U: Serialize,

Source§

fn serialize_as<S>( source: &T, serializer: S, ) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
where S: Serializer,

Serialize this value into the given Serde serializer.

Auto Trait Implementations§

§

impl<T> Freeze for TryFromIntoRef<T>

§

impl<T> RefUnwindSafe for TryFromIntoRef<T>
where T: RefUnwindSafe,

§

impl<T> Send for TryFromIntoRef<T>
where T: Send,

§

impl<T> Sync for TryFromIntoRef<T>
where T: Sync,

§

impl<T> Unpin for TryFromIntoRef<T>
where T: Unpin,

§

impl<T> UnwindSafe for TryFromIntoRef<T>
where T: 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<S> AssignWithType for S

Source§

fn assign_with_type<T, IntoT>(&mut self, component: IntoT)
where IntoT: Into<T>, S: Assign<T, IntoT>,

Sets the value of a component by its type. 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<C, E> EntryToVal<C> for E
where C: Collection<Entry = E>,

Source§

type Val = <C as Collection>::Val

The type of values stored in the collection. This might be distinct from Entry in complex collections. For example, in a HashMap, while Entry might be a ( key, value ) tuple, Val might only be the value part.
Source§

fn entry_to_val(self) -> <E as EntryToVal<C>>::Val

Converts an entry into a value representation specific to the type of collection. This conversion is crucial for handling operations on entries, especially when they need to be treated or accessed as individual values, such as retrieving the value part from a key-value pair in a hash map.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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> IntoEither for T

Source§

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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

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 more
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<Initial, Error, Final> TransitiveTryFrom<Error, Initial> for Final

Source§

fn transitive_try_from<Transitive>(src: Initial) -> Result<Self, Error>
where Transitive: TryFrom<Initial>, Self: TryFrom<Transitive, Error = Error>, Error: From<<Transitive as TryFrom<Initial>>::Error>,

Performs a transitive try_from conversion. Read more
Source§

impl<Error, Final, Initial> TransitiveTryInto<Error, Final> for Initial

Source§

fn transitive_try_into<Transitive>(self) -> Result<Final, Error>
where Self: TryInto<Transitive>, Transitive: TryInto<Final, Error = Error>, Error: From<Self::Error>,

Performs a transitive try_into conversion. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.
Source§

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

Source§

fn type_name(&self) -> &'static str

Return name of type of variable.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<C, Val> ValToEntry<C> for Val
where C: CollectionValToEntry<Val>,

Source§

fn val_to_entry(self) -> <C as CollectionValToEntry<Val>>::Entry

Invokes the val_to_entry function of the CollectionValToEntry trait to convert the value to an entry.

Source§

type Entry = <C as CollectionValToEntry<Val>>::Entry

Represents the type of entry that corresponds to the value within the collection.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

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