rust/hedgewars-server/src/protocol.rs
author Wuzzy <Wuzzy2@mail.ru>
Sun, 07 Apr 2019 19:26:16 +0200
changeset 14755 ab7bf5036314
parent 14462 98ef2913ec73
child 14780 09d46ab83361
permissions -rw-r--r--
Render mine timer if gear info is active

use netbuf;
use nom::{Err, IResult};
use std::io::{Read, Result};

pub mod messages;
mod parser;
#[cfg(test)]
pub mod test;

pub struct ProtocolDecoder {
    buf: netbuf::Buf,
    consumed: usize,
}

impl ProtocolDecoder {
    pub fn new() -> ProtocolDecoder {
        ProtocolDecoder {
            buf: netbuf::Buf::new(),
            consumed: 0,
        }
    }

    pub fn read_from<R: Read>(&mut self, stream: &mut R) -> Result<usize> {
        self.buf.read_from(stream)
    }

    pub fn extract_messages(&mut self) -> Vec<messages::HWProtocolMessage> {
        let parse_result = parser::extract_messages(&self.buf[..]);
        match parse_result {
            Ok((tail, msgs)) => {
                self.consumed = self.buf.len() - self.consumed - tail.len();
                msgs
            }
            Err(Err::Incomplete(_)) => unreachable!(),
            Err(Err::Error(_)) | Err(Err::Failure(_)) => unreachable!(),
        }
    }

    pub fn sweep(&mut self) {
        self.buf.consume(self.consumed);
        self.consumed = 0;
    }
}