1use crate::ext::BufExt;
2use crate::Result as CResult;
3use bytes::Buf;
4use std::io::{Error, ErrorKind};
5use std::str;
6
7#[derive(Debug)]
9pub enum TcpPacket {
10 Stdout(Stdout),
12 Dummy,
13}
14
15pub(crate) trait IncomingTcpPacket: Sized {
16 fn decode(buf: &mut impl Buf) -> CResult<Self>;
17}
18
19#[derive(Debug)]
22pub struct Stdout {
23 pub timestamp: f32,
24 pub message: String,
25 pub seqnum: u16,
26}
27
28impl Stdout {
29 pub fn decode(buf: &mut impl Buf, len: usize) -> CResult<Self> {
30 let timestamp = buf.read_f32_be()?;
31 let seqnum = buf.read_u16_be()?;
32 let mut v = vec![0; len - 6];
33 if buf.remaining() < v.len() {
34 return Err(Error::new(ErrorKind::UnexpectedEof, "Not enough data").into());
35 }
36 buf.copy_to_slice(&mut v[..]);
37 let message = str::from_utf8(&v[..])?;
38 Ok(Stdout {
39 timestamp,
40 message: message.to_string(),
41 seqnum,
42 })
43 }
44}