1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use bytes::{buf::Buf, BytesMut};
use tokio_util::codec::Decoder;
use i3ipc_types::{decode_event, event, MAGIC};
use std::io;
pub struct EventCodec;
impl Decoder for EventCodec {
type Error = io::Error;
type Item = event::Event;
fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, io::Error> {
if src.len() > 14 {
if &src[0..6] != MAGIC.as_bytes() {
return Err(io::Error::new(
io::ErrorKind::Other,
format!("Expected 'i3-ipc' but received: {:?}", &src[0..6]),
));
}
let payload_len = u32::from_ne_bytes([src[6], src[7], src[8], src[9]]) as usize;
let evt_type = u32::from_ne_bytes([src[10], src[11], src[12], src[13]]);
let end_len = 14 + payload_len;
if src.len() < end_len {
Ok(None)
} else {
let evt = decode_event(evt_type, &src[14..end_len])?;
src.advance(end_len);
Ok(Some(evt))
}
} else {
Ok(None)
}
}
}