Struct UntaggedEnumVisitor

Source
pub struct UntaggedEnumVisitor<'closure, 'de, Value> { /* private fields */ }

Implementations§

Source§

impl<'closure, 'de, Value> UntaggedEnumVisitor<'closure, 'de, Value>

Source

pub fn new() -> Self

Source

pub fn expecting(self, expecting: impl Display + 'closure) -> Self

Provide a message stating what data this untagged enum expects to receive.

This is used in error messages when deserialization fails. The message should complete the sentence “This Visitor expects to receive …”, for example the message could be “an integer, or map containing the keys ‘min’ and ‘max’”. The message should not be capitalized and should not end with a period.

UntaggedEnumVisitor::new()
    .expecting(format_args!("a string or number between 0 and {max}"))
    /* ... */
    .deserialize(deserializer)

If expecting is not called, then UntaggedEnumVisitor constructs a default message based on the set of closures given to it.

// by default, this enum expects "a boolean, string, or map"
UntaggedEnumVisitor::new()
    .bool(|b| ...)
    .string(|s| ...)
    .map(|m| ...)
    .deserialize(deserializer)
Source

pub fn bool( self, visit: impl FnOnce(bool) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn i8( self, visit: impl FnOnce(i8) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn i16( self, visit: impl FnOnce(i16) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn i32( self, visit: impl FnOnce(i32) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn i64( self, visit: impl FnOnce(i64) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn i128( self, visit: impl FnOnce(i128) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn u8( self, visit: impl FnOnce(u8) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn u16( self, visit: impl FnOnce(u16) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn u32( self, visit: impl FnOnce(u32) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn u64( self, visit: impl FnOnce(u64) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn u128( self, visit: impl FnOnce(u128) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn f32( self, visit: impl FnOnce(f32) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn f64( self, visit: impl FnOnce(f64) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn char( self, visit: impl FnOnce(char) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn string( self, visit: impl FnOnce(&str) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn borrowed_str( self, visit: impl FnOnce(&'de str) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn bytes( self, visit: impl FnOnce(&[u8]) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn borrowed_bytes( self, visit: impl FnOnce(&'de [u8]) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn byte_buf( self, visit: impl FnOnce(Vec<u8>) -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn none( self, visit: impl FnOnce() -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn unit( self, visit: impl FnOnce() -> Result<Value, Error> + 'closure, ) -> Self

Source

pub fn seq( self, visit: impl for<'access> FnOnce(Seq<'access, 'de>) -> Result<Value, Error> + 'closure, ) -> Self

Deserialize a sequence. The argument implements serde::de::SeqAccess.

Source

pub fn map( self, visit: impl for<'access> FnOnce(Map<'access, 'de>) -> Result<Value, Error> + 'closure, ) -> Self

Deserialize a key-value map. The argument implements serde::de::MapAccess.

use serde::de::MapAccess;
use serde_untagged::UntaggedEnumVisitor;
use std::collections::HashMap;

UntaggedEnumVisitor::new()
    .map(|mut map| {
        let mut hashmap = HashMap::new();
        while let Some(key) = map.next_key()? {
            let value = map.next_value()?;
            hashmap.insert(key, value);
        }
        Ok(hashmap)
    })
    .deserialize(deserializer)

If you need to inspect the contents of the map to decide how to deserialize, you can buffer it into some kind of Value and deserialize from there.

enum Response {
    // {"failure":"..."}
    Failure(String),
    // Anything else. {"ok":200}
    Success(serde_json::Value),
}

impl<'de> Deserialize<'de> for Response {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        UntaggedEnumVisitor::new()
            .map(|map| {
                let value: serde_json::Value = map.deserialize()?;
                if let Some(failure) = value["failure"].as_str() {
                    Ok(Response::Failure(failure.to_owned()))
                } else {
                    Ok(Response::Success(value))
                }
            })
            .deserialize(deserializer)
    }
}
Source

pub fn deserialize<D>(self, deserializer: D) -> Result<Value, D::Error>
where D: Deserializer<'de>,

Trait Implementations§

Source§

impl<'closure, 'de, Value> Visitor<'de> for UntaggedEnumVisitor<'closure, 'de, Value>

Source§

type Value = Value

The value produced by this visitor.
Source§

fn expecting(&self, formatter: &mut Formatter<'_>) -> Result

Format a message stating what data this Visitor expects to receive. Read more
Source§

fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
where E: Error,

The input contains a boolean. Read more
Source§

fn visit_i8<E>(self, v: i8) -> Result<Self::Value, E>
where E: Error,

The input contains an i8. Read more
Source§

fn visit_i16<E>(self, v: i16) -> Result<Self::Value, E>
where E: Error,

The input contains an i16. Read more
Source§

fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
where E: Error,

The input contains an i32. Read more
Source§

fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
where E: Error,

The input contains an i64. Read more
Source§

fn visit_i128<E>(self, v: i128) -> Result<Self::Value, E>
where E: Error,

The input contains a i128. Read more
Source§

fn visit_u8<E>(self, v: u8) -> Result<Self::Value, E>
where E: Error,

The input contains a u8. Read more
Source§

fn visit_u16<E>(self, v: u16) -> Result<Self::Value, E>
where E: Error,

The input contains a u16. Read more
Source§

fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
where E: Error,

The input contains a u32. Read more
Source§

fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
where E: Error,

The input contains a u64. Read more
Source§

fn visit_u128<E>(self, v: u128) -> Result<Self::Value, E>
where E: Error,

The input contains a u128. Read more
Source§

fn visit_f32<E>(self, v: f32) -> Result<Self::Value, E>
where E: Error,

The input contains an f32. Read more
Source§

fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>
where E: Error,

The input contains an f64. Read more
Source§

fn visit_char<E>(self, v: char) -> Result<Self::Value, E>
where E: Error,

The input contains a char. Read more
Source§

fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where E: Error,

The input contains a string. The lifetime of the string is ephemeral and it may be destroyed after this method returns. Read more
Source§

fn visit_borrowed_str<E>(self, v: &'de str) -> Result<Self::Value, E>
where E: Error,

The input contains a string that lives at least as long as the Deserializer. Read more
Source§

fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
where E: Error,

The input contains a byte array. The lifetime of the byte array is ephemeral and it may be destroyed after this method returns. Read more
Source§

fn visit_borrowed_bytes<E>(self, v: &'de [u8]) -> Result<Self::Value, E>
where E: Error,

The input contains a byte array that lives at least as long as the Deserializer. Read more
Source§

fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>
where E: Error,

The input contains a byte array and ownership of the byte array is being given to the Visitor. Read more
Source§

fn visit_none<E>(self) -> Result<Self::Value, E>
where E: Error,

The input contains an optional that is absent. Read more
Source§

fn visit_unit<E>(self) -> Result<Self::Value, E>
where E: Error,

The input contains a unit (). Read more
Source§

fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
where A: SeqAccess<'de>,

The input contains a sequence of elements. Read more
Source§

fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
where A: MapAccess<'de>,

The input contains a key-value map. Read more
Source§

fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
where E: Error,

The input contains a string and ownership of the string is being given to the Visitor. Read more
Source§

fn visit_some<D>( self, deserializer: D, ) -> Result<Self::Value, <D as Deserializer<'de>>::Error>
where D: Deserializer<'de>,

The input contains an optional that is present. Read more
Source§

fn visit_newtype_struct<D>( self, deserializer: D, ) -> Result<Self::Value, <D as Deserializer<'de>>::Error>
where D: Deserializer<'de>,

The input contains a newtype struct. Read more
Source§

fn visit_enum<A>( self, data: A, ) -> Result<Self::Value, <A as EnumAccess<'de>>::Error>
where A: EnumAccess<'de>,

The input contains an enum. Read more

Auto Trait Implementations§

§

impl<'closure, 'de, Value> Freeze for UntaggedEnumVisitor<'closure, 'de, Value>

§

impl<'closure, 'de, Value> !RefUnwindSafe for UntaggedEnumVisitor<'closure, 'de, Value>

§

impl<'closure, 'de, Value> !Send for UntaggedEnumVisitor<'closure, 'de, Value>

§

impl<'closure, 'de, Value> !Sync for UntaggedEnumVisitor<'closure, 'de, Value>

§

impl<'closure, 'de, Value> Unpin for UntaggedEnumVisitor<'closure, 'de, Value>

§

impl<'closure, 'de, Value> !UnwindSafe for UntaggedEnumVisitor<'closure, 'de, Value>

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<'de, T> Expected for T
where T: Visitor<'de>,

Source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result<(), Error>

Format an explanation of what data was being expected. Same signature as the Display and Debug traits.
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 = 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.