use crate::ext::BufExt;
use crate::Result as CResult;
use bytes::Buf;
use std::io::{Error, ErrorKind};
use std::str;
#[derive(Debug)]
pub enum TcpPacket {
Stdout(Stdout),
Dummy,
}
pub(crate) trait IncomingTcpPacket: Sized {
fn decode(buf: &mut impl Buf) -> CResult<Self>;
}
#[derive(Debug)]
pub struct Stdout {
pub timestamp: f32,
pub message: String,
pub seqnum: u16,
}
impl Stdout {
pub fn decode(buf: &mut impl Buf, len: usize) -> CResult<Self> {
let timestamp = buf.read_f32_be()?;
let seqnum = buf.read_u16_be()?;
let mut v = vec![0; len - 6];
if buf.remaining() < v.len() {
return Err(Error::new(ErrorKind::UnexpectedEof, "Not enough data").into());
}
buf.copy_to_slice(&mut v[..]);
let message = str::from_utf8(&v[..])?;
Ok(Stdout {
timestamp,
message: message.to_string(),
seqnum,
})
}
}