plaintalk/pullparser/
pullparser.rs

1use std::io::Read;
2
3use super::error::*;
4use super::message::*;
5
6pub enum PullParserState {
7	Initial,
8	Done,
9	Error(&'static str),
10}
11
12pub struct PullParser<R> {
13	inner: R,
14	state: PullParserState,
15}
16
17impl<R: Read> PullParser<R> {
18	pub fn new(inner: R) -> PullParser<R> {
19		PullParser {
20			inner: inner,
21			state: PullParserState::Initial,
22		}
23	}
24
25	pub fn get_message<'x, 'y: 'x+'y>(&'y mut self) -> Result<Option<Message<'x>>, &'static str> {
26		match self.state {
27			PullParserState::Initial => Ok(Some(Message::new(&mut self.inner, &mut self.state))),
28			PullParserState::Done => Ok(None),
29			PullParserState::Error(err) => Err(err),
30		}
31	}
32
33	pub fn read_message(&mut self) -> Result<Option<Vec<Vec<u8>>>, Error> {
34		if let Some(mut message) = try!{self.get_message()} {
35			let mut buffered_message = Vec::new();
36			loop {
37				let mut buffered_field = Vec::new();
38				match try!{message.read_field_to_end(&mut buffered_field)} {
39					Some(_) => buffered_message.push(buffered_field),
40					None => break
41				}
42			}
43			Ok(Some(buffered_message))
44		} else {
45			Ok(None)
46		}
47	}
48}