craftio_rs/
connection.rs

1#[cfg(feature = "encryption")]
2use crate::cfb8::CipherError;
3use crate::reader::{CraftReader, CraftSyncReader, ReadResult};
4use crate::wrapper::{CraftIo, CraftWrapper};
5use crate::writer::{CraftSyncWriter, CraftWriter, WriteResult};
6use mcproto_rs::protocol::{Packet, RawPacket, State, Id};
7#[cfg(feature = "gat")]
8use mcproto_rs::protocol::PacketKind;
9#[cfg(any(feature = "futures-io", feature = "tokio-io"))]
10use {
11    crate::{reader::CraftAsyncReader, writer::CraftAsyncWriter},
12    async_trait::async_trait,
13};
14
15pub struct CraftConnection<R, W> {
16    pub(crate) reader: CraftReader<R>,
17    pub(crate) writer: CraftWriter<W>,
18}
19
20impl<R, W> CraftWrapper<(R, W)> for CraftConnection<R, W> {
21    fn into_inner(self) -> (R, W) {
22        (self.reader.into_inner(), self.writer.into_inner())
23    }
24}
25
26impl<R, W> CraftIo for CraftConnection<R, W> {
27    fn set_state(&mut self, next: State) {
28        self.reader.set_state(next);
29        self.writer.set_state(next);
30    }
31
32    #[cfg(feature = "compression")]
33    fn set_compression_threshold(&mut self, threshold: Option<i32>) {
34        self.reader.set_compression_threshold(threshold);
35        self.writer.set_compression_threshold(threshold);
36    }
37
38    #[cfg(feature = "encryption")]
39    fn enable_encryption(&mut self, key: &[u8], iv: &[u8]) -> Result<(), CipherError> {
40        self.reader.enable_encryption(key, iv)?;
41        self.writer.enable_encryption(key, iv)?;
42        Ok(())
43    }
44
45    fn set_max_packet_size(&mut self, max_size: usize) {
46        self.reader.set_max_packet_size(max_size);
47        self.writer.set_max_packet_size(max_size);
48    }
49
50    fn ensure_buf_capacity(&mut self, capacity: usize) {
51        self.reader.ensure_buf_capacity(capacity);
52        self.writer.ensure_buf_capacity(capacity);
53    }
54
55    #[cfg(feature = "compression")]
56    fn ensure_compression_buf_capacity(&mut self, capacity: usize) {
57        self.reader.ensure_buf_capacity(capacity);
58        self.writer.ensure_buf_capacity(capacity);
59    }
60}
61
62impl<R, W> CraftSyncReader for CraftConnection<R, W>
63where
64    CraftReader<R>: CraftSyncReader,
65    CraftWriter<W>: CraftSyncWriter,
66{
67    #[cfg(not(feature = "gat"))]
68    fn read_packet<'a, P>(&'a mut self) -> ReadResult<<P as RawPacket<'a>>::Packet>
69    where
70        P: RawPacket<'a>,
71    {
72        self.reader.read_packet::<P>()
73    }
74
75    #[cfg(feature = "gat")]
76    fn read_packet<P>(&mut self) -> ReadResult<<P::RawPacket<'_> as RawPacket>::Packet>
77    where
78        P: PacketKind
79    {
80        self.reader.read_packet::<P>()
81    }
82
83    #[cfg(not(feature = "gat"))]
84    fn read_raw_packet<'a, P>(&'a mut self) -> ReadResult<P>
85    where
86        P: RawPacket<'a>,
87    {
88        self.reader.read_raw_packet::<P>()
89    }
90
91    #[cfg(feature = "gat")]
92    fn read_raw_packet<P>(&mut self) -> ReadResult<P::RawPacket<'_>>
93    where
94        P: PacketKind
95    {
96        self.reader.read_raw_packet::<P>()
97    }
98
99    fn read_raw_untyped_packet(&mut self) -> ReadResult<(Id, &[u8])> {
100        self.reader.read_raw_untyped_packet()
101    }
102}
103
104impl<R, W> CraftSyncWriter for CraftConnection<R, W>
105where
106    CraftReader<R>: CraftSyncReader,
107    CraftWriter<W>: CraftSyncWriter,
108{
109    fn write_packet<P>(&mut self, packet: P) -> WriteResult<()>
110    where
111        P: Packet,
112    {
113        self.writer.write_packet(packet)
114    }
115
116    fn write_raw_packet<'a, P>(&mut self, packet: P) -> WriteResult<()>
117    where
118        P: RawPacket<'a>,
119    {
120        self.writer.write_raw_packet(packet)
121    }
122}
123
124#[cfg(any(feature = "futures-io", feature = "tokio-io"))]
125#[async_trait]
126impl<R, W> CraftAsyncReader for CraftConnection<R, W>
127where
128    CraftReader<R>: CraftAsyncReader,
129    R: Send + Sync,
130    CraftWriter<W>: CraftAsyncWriter,
131    W: Send + Sync,
132{
133    #[cfg(not(feature = "gat"))]
134    async fn read_packet_async<'a, P>(&'a mut self) -> ReadResult<<P as RawPacket<'a>>::Packet>
135    where
136        P: RawPacket<'a>,
137    {
138        self.reader.read_packet_async::<P>().await
139    }
140
141    #[cfg(feature = "gat")]
142    async fn read_packet_async<P>(&mut self) -> ReadResult<<P::RawPacket<'_> as RawPacket<'_>>::Packet>
143    where
144        P: PacketKind
145    {
146        self.reader.read_packet_async::<P>().await
147    }
148
149    #[cfg(not(feature = "gat"))]
150    async fn read_raw_packet_async<'a, P>(&'a mut self) -> ReadResult<P>
151    where
152        P: RawPacket<'a>,
153    {
154        self.reader.read_raw_packet_async::<P>().await
155    }
156
157    #[cfg(feature = "gat")]
158    async fn read_raw_packet_async<P>(&mut self) -> ReadResult<P::RawPacket<'_>>
159    where
160        P: PacketKind
161    {
162        self.reader.read_raw_packet_async::<P>().await
163    }
164
165    async fn read_raw_untyped_packet_async(&mut self) -> ReadResult<(Id, &[u8])> {
166        self.reader.read_raw_untyped_packet_async().await
167    }
168}
169
170#[cfg(any(feature = "futures-io", feature = "tokio-io"))]
171#[async_trait]
172impl<R, W> CraftAsyncWriter for CraftConnection<R, W>
173where
174    CraftReader<R>: CraftAsyncReader,
175    R: Send + Sync,
176    CraftWriter<W>: CraftAsyncWriter,
177    W: Send + Sync,
178{
179    async fn write_packet_async<P>(&mut self, packet: P) -> WriteResult<()>
180    where
181        P: Packet + Send + Sync,
182    {
183        self.writer.write_packet_async(packet).await
184    }
185
186    async fn write_raw_packet_async<'a, P>(&mut self, packet: P) -> WriteResult<()>
187    where
188        P: RawPacket<'a> + Send + Sync,
189    {
190        self.writer.write_raw_packet_async(packet).await
191    }
192}
193
194impl<R, W> CraftConnection<R, W> {
195    pub fn into_split(self) -> (CraftReader<R>, CraftWriter<W>) {
196        (self.reader, self.writer)
197    }
198
199    pub fn split(&mut self) -> (&mut CraftReader<R>, &mut CraftWriter<W>) {
200        (&mut self.reader, &mut self.writer)
201    }
202}