gopher_core/
codec.rs

1use bytes::{BytesMut, BufMut};
2use std::io;
3use tokio_io::codec::{Decoder, Encoder};
4use types::{GopherRequest, GopherResponse};
5
6/// A codec for building a Gopher server.
7pub 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        // Read a CR+LF delimited line.
15        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        // Discard the CR+LF.
20        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}