An efficient way of discarding data from a deserializer.
Think of this like serde_json::Value
in that it can be deserialized from
any type, except that it does not store any information about the data that
gets deserialized.
use std::fmt;
use std::marker::PhantomData;
use serde::de::{self, Deserialize, DeserializeSeed, Deserializer, Visitor, SeqAccess, IgnoredAny};
pub struct NthElement<T> {
n: usize,
marker: PhantomData<T>,
}
impl<T> NthElement<T> {
pub fn new(n: usize) -> Self {
NthElement {
n: n,
marker: PhantomData,
}
}
}
impl<'de, T> Visitor<'de> for NthElement<T>
where
T: Deserialize<'de>,
{
type Value = T;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
write!(formatter, "a sequence in which we care about element {}", self.n)
}
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
for i in 0..self.n {
if seq.next_element::<IgnoredAny>()?.is_none() {
return Err(de::Error::invalid_length(i, &self));
}
}
let nth = match seq.next_element()? {
Some(nth) => nth,
None => {
return Err(de::Error::invalid_length(self.n, &self));
}
};
while let Some(IgnoredAny) = seq.next_element()? {
}
Ok(nth)
}
}
impl<'de, T> DeserializeSeed<'de> for NthElement<T>
where
T: Deserialize<'de>,
{
type Value = T;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_seq(self)
}
}
let s: String = NthElement::new(3).deserialize(deserializer)?;
Performs copy-assignment from source
. Read more
Formats the value using the given formatter. Read more
Returns the "default value" for a type. Read more
The value produced by this visitor.
Format a message stating what data this Visitor expects to receive. Read more
The input contains a string. The lifetime of the string is ephemeral and it may be destroyed after this method returns. Read more
The input contains an optional that is absent. Read more
The input contains an optional that is present. Read more
The input contains a newtype struct. Read more
The input contains a sequence of elements. Read more
The input contains a key-value map. Read more
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
The input contains a string that lives at least as long as the Deserializer
. Read more
The input contains a string and ownership of the string is being given to the Visitor
. Read more
The input contains a byte array that lives at least as long as the Deserializer
. Read more
The input contains a byte array and ownership of the byte array is being given to the Visitor
. Read more
Deserialize this value from the given Serde deserializer. Read more