Skip to content

Instantly share code, notes, and snippets.

@nixpulvis
Created February 5, 2016 21:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nixpulvis/f1effbbf54d633218187 to your computer and use it in GitHub Desktop.
Save nixpulvis/f1effbbf54d633218187 to your computer and use it in GitHub Desktop.
Deserialize Iterator
use std::marker::PhantomData;
use std::iter::Peekable;
use std::io::{Read, Bytes};
use serde::Deserialize;
use serde_json as json;
use serde_json::error::Error as JsonError;
/// Iterator over parsed Messages.
pub struct DeserializeIter<T: Deserialize, R: Read> {
bytes: Peekable<Bytes<R>>,
_phantom: PhantomData<T>,
}
impl<T: Deserialize, R: Read> DeserializeIter<T, R> {
/// Returns Iterator of deserialized Messages from an iterator over
/// result bytes, generally from reading an IO stream.
pub fn new(reader: R) -> DeserializeIter<T, R> {
DeserializeIter {
bytes: reader.bytes().peekable(),
_phantom: PhantomData,
}
}
}
impl<T: Deserialize, R: Read> Iterator for DeserializeIter<T, R> {
type Item = Result<T, JsonError>;
fn next(&mut self) -> Option<Result<T, JsonError>> {
if self.bytes.peek().is_none() {
None
} else {
let mut deserializer = json::Deserializer::new(&mut self.bytes);
Some(Deserialize::deserialize(&mut deserializer))
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment