use std::io::{Cursor, Error, ErrorKind};
use bytes::{Buf, BytesMut};
use tokio_util::codec::Decoder;
use crate::nineteen::decode_nineteen;
use crate::packet::Packet;
pub struct F1Codec;
impl Decoder for F1Codec {
type Item = Packet;
type Error = Error;
fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Error> {
let mut cursor = Cursor::new(src);
if cursor.remaining() < 2 {
return Ok(None);
}
let packet_format = cursor.get_u16_le();
let packet = match packet_format {
2019 => decode_nineteen(&mut cursor),
format => Err(Error::new(
ErrorKind::InvalidData,
format!("Unknown packet format {}.", format),
)),
};
match packet {
Ok(packet) => Ok(Some(packet)),
Err(error) => match error.kind() {
ErrorKind::UnexpectedEof => Ok(None),
_ => Err(error),
},
}
}
}