diff options
author | Joey Sacchini <joey@sacchini.net> | 2020-12-07 18:39:15 -0500 |
---|---|---|
committer | Joey Sacchini <joey@sacchini.net> | 2020-12-07 18:39:15 -0500 |
commit | 317fe7da922303c9ecf3e8de4d202382067dc5a9 (patch) | |
tree | 4e281fc41405685d4a47cb830ed981d844104a4d | |
parent | fb57b7dbc7ec4422e29c076a8b0fe777db660a69 (diff) | |
download | craftio-rs-317fe7da922303c9ecf3e8de4d202382067dc5a9.tar.gz craftio-rs-317fe7da922303c9ecf3e8de4d202382067dc5a9.tar.bz2 craftio-rs-317fe7da922303c9ecf3e8de4d202382067dc5a9.zip |
support generic associated types
-rw-r--r-- | Cargo.lock | 18 | ||||
-rw-r--r-- | Cargo.toml | 5 | ||||
-rw-r--r-- | src/connection.rs | 55 | ||||
-rw-r--r-- | src/reader.rs | 80 |
4 files changed, 135 insertions, 23 deletions
@@ -308,9 +308,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.80" +version = "0.2.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" +checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb" [[package]] name = "libz-sys" @@ -335,7 +335,7 @@ dependencies = [ [[package]] name = "mcproto-rs" version = "0.2.0" -source = "git+https://github.com/Twister915/mcproto-rs?branch=master#171a93a33c7cc282a1726851eebb69ad4fffe5fc" +source = "git+https://github.com/Twister915/mcproto-rs?branch=master#606d52dfe675c21c735157b1da1fc0634b1daaeb" dependencies = [ "base64", "rand", @@ -546,18 +546,18 @@ checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" [[package]] name = "serde" -version = "1.0.117" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88fa983de7720629c9387e9f517353ed404164b1e482c970a90c1a4aaf7dc1a" +checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.117" +version = "1.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd1ae72adb44aab48f325a02444a5fc079349a8d804c1fc922aed3f7454c74e" +checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df" dependencies = [ "proc-macro2", "quote", @@ -583,9 +583,9 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "syn" -version = "1.0.53" +version = "1.0.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" +checksum = "9a2af957a63d6bd42255c359c93d9bfdb97076bd3b820897ce55ffbfbf107f44" dependencies = [ "proc-macro2", "quote", @@ -17,10 +17,11 @@ async-trait = { version = "0.1.42", optional = true } tokio = { version = "0.2", features = ["rt-threaded", "tcp", "io-util", "macros", "dns"], optional = true } [features] -default = [ "compression", "encryption" ] +default = [ "compression", "encryption", "gat", "tokio-io" ] futures-io = ["futures", "async-trait"] tokio-io = ["tokio", "async-trait"] encryption = ["aes"] compression = [ "flate2" ] -backtrace = []
\ No newline at end of file +backtrace = [] +gat = ["mcproto-rs/gat"]
\ No newline at end of file diff --git a/src/connection.rs b/src/connection.rs index 8de42f3..f53f07d 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -4,7 +4,8 @@ use crate::reader::{CraftReader, CraftSyncReader, ReadResult}; use crate::wrapper::{CraftIo, CraftWrapper}; use crate::writer::{CraftSyncWriter, CraftWriter, WriteResult}; use mcproto_rs::protocol::{Packet, RawPacket, State}; - +#[cfg(feature = "gat")] +use mcproto_rs::protocol::PacketKind; #[cfg(any(feature = "futures-io", feature = "tokio-io"))] use { crate::{reader::CraftAsyncReader, writer::CraftAsyncWriter}, @@ -16,9 +17,9 @@ pub struct CraftConnection<R, W> { pub(crate) writer: CraftWriter<W>, } -impl<R, W> CraftWrapper<(CraftReader<R>, CraftWriter<W>)> for CraftConnection<R, W> { - fn into_inner(self) -> (CraftReader<R>, CraftWriter<W>) { - (self.reader, self.writer) +impl<R, W> CraftWrapper<(R, W)> for CraftConnection<R, W> { + fn into_inner(self) -> (R, W) { + (self.reader.into_inner(), self.writer.into_inner()) } } @@ -47,6 +48,7 @@ where CraftReader<R>: CraftSyncReader, CraftWriter<W>: CraftSyncWriter, { + #[cfg(not(feature = "gat"))] fn read_packet<'a, P>(&'a mut self) -> ReadResult<<P as RawPacket<'a>>::Packet> where P: RawPacket<'a>, @@ -54,12 +56,29 @@ where self.reader.read_packet::<P>() } + #[cfg(feature = "gat")] + fn read_packet<P>(&mut self) -> ReadResult<<P::RawPacket<'_> as RawPacket>::Packet> + where + P: PacketKind + { + self.reader.read_packet::<P>() + } + + #[cfg(not(feature = "gat"))] fn read_raw_packet<'a, P>(&'a mut self) -> ReadResult<P> where P: RawPacket<'a>, { self.reader.read_raw_packet::<P>() } + + #[cfg(feature = "gat")] + fn read_raw_packet<P>(&mut self) -> ReadResult<P::RawPacket<'_>> + where + P: PacketKind + { + self.reader.read_raw_packet::<P>() + } } impl<R, W> CraftSyncWriter for CraftConnection<R, W> @@ -91,6 +110,7 @@ where CraftWriter<W>: CraftAsyncWriter, W: Send + Sync, { + #[cfg(not(feature = "gat"))] async fn read_packet_async<'a, P>(&'a mut self) -> ReadResult<<P as RawPacket<'a>>::Packet> where P: RawPacket<'a>, @@ -98,12 +118,29 @@ where self.reader.read_packet_async::<P>().await } + #[cfg(feature = "gat")] + async fn read_packet_async<P>(&mut self) -> ReadResult<<P::RawPacket<'_> as RawPacket<'_>>::Packet> + where + P: PacketKind + { + self.reader.read_packet_async::<P>().await + } + + #[cfg(not(feature = "gat"))] async fn read_raw_packet_async<'a, P>(&'a mut self) -> ReadResult<P> where P: RawPacket<'a>, { self.reader.read_raw_packet_async::<P>().await } + + #[cfg(feature = "gat")] + async fn read_raw_packet_async<P>(&mut self) -> ReadResult<P::RawPacket<'_>> + where + P: PacketKind + { + self.reader.read_raw_packet_async::<P>().await + } } #[cfg(any(feature = "futures-io", feature = "tokio-io"))] @@ -129,3 +166,13 @@ where self.writer.write_raw_packet_async(packet).await } } + +impl<R, W> CraftConnection<R, W> { + pub fn into_split(self) -> (CraftReader<R>, CraftWriter<W>) { + (self.reader, self.writer) + } + + pub fn split(&mut self) -> (&mut CraftReader<R>, &mut CraftWriter<W>) { + (&mut self.reader, &mut self.writer) + } +}
\ No newline at end of file diff --git a/src/reader.rs b/src/reader.rs index 271e0b7..5dcbd87 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -5,6 +5,8 @@ use crate::wrapper::{CraftIo, CraftWrapper}; #[cfg(feature = "compression")] use flate2::{DecompressError, FlushDecompress, Status}; use mcproto_rs::protocol::{Id, PacketDirection, RawPacket, State}; +#[cfg(feature = "gat")] +use mcproto_rs::protocol::PacketKind; use mcproto_rs::types::VarInt; use mcproto_rs::{Deserialize, Deserialized}; #[cfg(feature = "backtrace")] @@ -62,6 +64,7 @@ pub type ReadResult<P> = Result<Option<P>, ReadError>; #[cfg(any(feature = "futures-io", feature = "tokio-io"))] #[async_trait] pub trait CraftAsyncReader { + #[cfg(not(feature = "gat"))] async fn read_packet_async<'a, P>(&'a mut self) -> ReadResult<<P as RawPacket<'a>>::Packet> where P: RawPacket<'a>, @@ -69,12 +72,27 @@ pub trait CraftAsyncReader { deserialize_raw_packet(self.read_raw_packet_async::<P>().await) } + #[cfg(feature = "gat")] + async fn read_packet_async<P>(&mut self) -> ReadResult<<P::RawPacket<'_> as RawPacket<'_>>::Packet> + where + P: PacketKind + { + deserialize_raw_packet(self.read_raw_packet_async::<P>().await) + } + + #[cfg(not(feature = "gat"))] async fn read_raw_packet_async<'a, P>(&'a mut self) -> ReadResult<P> where P: RawPacket<'a>; + + #[cfg(feature = "gat")] + async fn read_raw_packet_async<P>(&mut self) -> ReadResult<P::RawPacket<'_>> + where + P: PacketKind; } pub trait CraftSyncReader { + #[cfg(not(feature = "gat"))] fn read_packet<'a, P>(&'a mut self) -> ReadResult<<P as RawPacket<'a>>::Packet> where P: RawPacket<'a>, @@ -82,9 +100,23 @@ pub trait CraftSyncReader { deserialize_raw_packet(self.read_raw_packet::<'a, P>()) } + #[cfg(feature = "gat")] + fn read_packet<P>(&mut self) -> ReadResult<<P::RawPacket<'_> as RawPacket>::Packet> + where + P: PacketKind + { + deserialize_raw_packet(self.read_raw_packet::<P>()) + } + + #[cfg(not(feature = "gat"))] fn read_raw_packet<'a, P>(&'a mut self) -> ReadResult<P> where P: RawPacket<'a>; + + #[cfg(feature = "gat")] + fn read_raw_packet<'a, P>(&'a mut self) -> ReadResult<P::RawPacket<'a>> + where + P: PacketKind; } pub struct CraftReader<R> { @@ -150,14 +182,20 @@ impl<R> CraftSyncReader for CraftReader<R> where R: io::Read, { + #[cfg(not(feature = "gat"))] fn read_raw_packet<'a, P>(&'a mut self) -> ReadResult<P> where P: RawPacket<'a>, { - self.move_ready_data_to_front(); - let primary_packet_len = rr_unwrap!(self.read_packet_len_sync()).0 as usize; - self.ensure_n_ready_sync(primary_packet_len)?; - self.read_packet_in_buf(primary_packet_len) + self.read_raw_packet_inner::<P>() + } + + #[cfg(feature = "gat")] + fn read_raw_packet<'a, P>(&'a mut self) -> ReadResult<P::RawPacket<'a>> + where + P: PacketKind + { + self.read_raw_packet_inner::<P::RawPacket<'a>>() } } @@ -167,14 +205,20 @@ impl<R> CraftAsyncReader for CraftReader<R> where R: AsyncReadExact, { + #[cfg(not(feature = "gat"))] async fn read_raw_packet_async<'a, P>(&'a mut self) -> ReadResult<P> where P: RawPacket<'a>, { - self.move_ready_data_to_front(); - let primary_packet_len = rr_unwrap!(self.read_packet_len_async().await).0 as usize; - self.ensure_n_ready_async(primary_packet_len).await?; - self.read_packet_in_buf(primary_packet_len) + self.read_raw_packet_inner_async().await + } + + #[cfg(feature = "gat")] + async fn read_raw_packet_async<P>(&mut self) -> ReadResult<P::RawPacket<'_>> + where + P: PacketKind, + { + self.read_raw_packet_inner_async::<P::RawPacket<'_>>().await } } @@ -182,6 +226,16 @@ impl<R> CraftReader<R> where R: io::Read, { + fn read_raw_packet_inner<'a, P>(&'a mut self) -> ReadResult<P> + where + P: RawPacket<'a> + { + self.move_ready_data_to_front(); + let primary_packet_len = rr_unwrap!(self.read_packet_len_sync()).0 as usize; + self.ensure_n_ready_sync(primary_packet_len)?; + self.read_packet_in_buf(primary_packet_len) + } + fn read_packet_len_sync(&mut self) -> ReadResult<VarInt> { let buf = rr_unwrap!(self.ensure_n_ready_sync(VAR_INT_BUF_SIZE)); let (v, size) = rr_unwrap!(deserialize_varint(buf)); @@ -209,6 +263,16 @@ impl<R> CraftReader<R> where R: AsyncReadExact, { + async fn read_raw_packet_inner_async<'a, P>(&'a mut self) -> ReadResult<P> + where + P: RawPacket<'a> + { + self.move_ready_data_to_front(); + let primary_packet_len = rr_unwrap!(self.read_packet_len_async().await).0 as usize; + self.ensure_n_ready_async(primary_packet_len).await?; + self.read_packet_in_buf(primary_packet_len) + } + async fn read_packet_len_async(&mut self) -> ReadResult<VarInt> { self.move_ready_data_to_front(); let buf = rr_unwrap!(self.ensure_n_ready_async(VAR_INT_BUF_SIZE).await); |