1use bytes::{BytesMut, BufMut};
2use std::io;
3use tokio_io::codec::{Decoder, Encoder};
4use types::{GopherRequest, GopherResponse};
5
6pub struct ServerCodec;
8
9impl Decoder for ServerCodec {
10 type Item = GopherRequest;
11 type Error = io::Error;
12
13 fn decode(&mut self, buf: &mut BytesMut) -> io::Result<Option<Self::Item>> {
14 let line = match buf.windows(2).position(|w| w == b"\r\n") {
16 Some(i) => buf.split_to(i),
17 None => return Ok(None)
18 };
19 buf.split_to(2);
21
22 Ok(Some(GopherRequest::decode(line.freeze())))
23 }
24}
25
26impl Encoder for ServerCodec {
27 type Item = GopherResponse;
28 type Error = io::Error;
29
30 fn encode(&mut self, message: Self::Item, buf: &mut BytesMut) -> io::Result<()> {
31 message.encode(buf.writer())
32 }
33}