1use quick_error::quick_error;
2
3quick_error! {
4 #[derive(Debug)]
5 pub enum CustomError {
6 Error(err: Box<dyn std::error::Error + Send + Sync>) {
7 display("{}", err)
8 from()
9 source(&**err)
10 }
11 String(message: String) {
12 display("{}", message)
13 }
14 StaticStr(message: &'static str) {
15 display("{}", message)
16 }
17 }
18}
19
20quick_error! {
21 #[derive(Debug)]
22 pub enum InputPacketBytesError {
23 NoBytes(length: usize) {
24 display("Length of the packet is {}", length)
25 }
26 Custom(err: CustomError) {
27 display("Input packet caused an error {}", err)
28 from()
29 source(err)
30 }
31 }
32}
33
34quick_error! {
35 #[derive(Debug)]
36 pub enum PacketReadableError {
37 InputPacketBytes(err: InputPacketBytesError) {
38 display("{}", err)
39 from()
40 source(err)
41 }
42 Custom(err: CustomError) {
43 display("Readable caused an error {}", err)
44 from()
45 source(err)
46 }
47 }
48}
49
50quick_error! {
51 #[derive(Debug)]
52 pub enum PacketWritableError {
53 Custom(err: CustomError) {
54 display("Writable caused an error {}", err)
55 from()
56 source(err)
57 }
58 }
59}
60
61pub type InputPacketBytesResult<T> = std::result::Result<T, InputPacketBytesError>;
62pub type OutputPacketBytesResult = std::result::Result<(), Box<dyn std::error::Error + Send + Sync>>;
63pub type PacketWritableResult = std::result::Result<(), PacketWritableError>;
64pub type PacketReadableResult<T> = std::result::Result<T, PacketReadableError>;
65
66#[async_trait::async_trait]
67pub trait InputPacketBytes: Send + Sync {
68 async fn take_byte(&mut self) -> InputPacketBytesResult<u8>;
69
70 async fn take_slice(&mut self, slice: &mut [u8]) -> InputPacketBytesResult<()>;
71
72 async fn take_vec(&mut self, vec: &mut Vec<u8>, count: usize) -> InputPacketBytesResult<()>;
73
74 fn has_bytes(&self, count: usize) -> bool;
75
76 fn remaining_bytes(&self) -> usize;
77}
78
79#[async_trait::async_trait]
80pub trait OutputPacketBytes: Send + Sync {
81 async fn write_byte(&mut self, byte: u8) -> OutputPacketBytesResult;
82
83 async fn write_bytes(&mut self, slice: &[u8]) -> OutputPacketBytesResult;
84}
85
86#[async_trait::async_trait]
87pub trait PacketWritable {
88 async fn write(self, output: &mut impl OutputPacketBytes) -> PacketWritableResult;
89}
90
91#[async_trait::async_trait]
92pub trait PacketReadable: Sized {
93 async fn read(input: &mut impl InputPacketBytes) -> PacketReadableResult<Self>;
94}
95
96#[derive(Debug, Copy, Clone, PartialEq)]
97pub enum PacketState {
98 Handshake,
99 Status,
100 Login,
101 Play,
102}
103
104#[derive(Debug, Copy, Clone, PartialEq)]
105pub enum PacketSide {
106 Server,
107 Client,
108}
109
110pub trait Packet: PacketWritable + PacketReadable {
111 fn id() -> i32;
112
113 fn side() -> PacketSide;
114
115 fn state() -> PacketState;
116
117 fn protocol() -> i32;
118}