[][src]Struct serde_iter::CloneOnce

pub struct CloneOnce<T, I>(_)
where
    I: Iterator<Item = T>
;

A hack utility struct to wrap use-once iterators.

Clone semantics

Every time CloneOnce is cloned, the underlying iterator is moved to the CloneOnce returned by the clone method, and the original CloneOnce will panick if it is iterated over. This behaviour would result in serde_iter consuming the underlying iterator exactly once if it is only serialized exactly once.

Usage

Wrap your iterator with this struct if you are very sure that it will only be serialized once. This hack is necessary if your iterator does not implement Clone.

Example

#[derive(serde::Serialize)]
struct Foo<I>
where
    I: Iterator<Item = u32> + Clone,
{
    #[serde(with = "serde_iter::seq")]
    bar: I,
}

let mut v = vec![1, 2, 3];
let drain = v.drain(..);
let foo = Foo {
    bar: serde_iter::CloneOnce::from(drain),
};

assert_eq!(serde_json::to_value(&foo).unwrap(), serde_json::json!({
    "bar": [1, 2, 3]
}));

If this struct is serialized again, it panicks:

#[derive(serde::Serialize)]
struct Foo<I>
where
    I: Iterator<Item = u32> + Clone,
{
    #[serde(with = "serde_iter::seq")]
    bar: I,
}

let mut v = vec![1, 2, 3];
let drain = v.drain(..);
let foo = Foo {
    bar: serde_iter::CloneOnce::from(drain),
};

assert_eq!(serde_json::to_value(&foo).unwrap(), serde_json::json!({
    "bar": [1, 2, 3]
}));
serde_json::to_value(&foo).ok();

Trait Implementations

impl<T, I> Clone for CloneOnce<T, I> where
    I: Iterator<Item = T>, 
[src]

Moves the underlying iterator to a cloned value, and leaves a panicking iterator.

impl<T, I> From<I> for CloneOnce<T, I> where
    I: Iterator<Item = T>, 
[src]

Converts a (non-Clone) iterator into a CloneOnce iterator.

impl<T, I> Iterator for CloneOnce<T, I> where
    I: Iterator<Item = T>, 
[src]

type Item = T

The type of the elements being iterated over.

Auto Trait Implementations

impl<T, I> !RefUnwindSafe for CloneOnce<T, I>

impl<T, I> Send for CloneOnce<T, I> where
    I: Send

impl<T, I> !Sync for CloneOnce<T, I>

impl<T, I> Unpin for CloneOnce<T, I> where
    I: Unpin

impl<T, I> UnwindSafe for CloneOnce<T, I> where
    I: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> From<!> for T[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<I> IntoIterator for I where
    I: Iterator
[src]

type Item = <I as Iterator>::Item

The type of the elements being iterated over.

type IntoIter = I

Which kind of iterator are we turning this into?

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.