plaintalk/pullparser/
pullparser.rs1use 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}