aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoey Sacchini <joey@sacchini.net>2020-12-07 18:39:15 -0500
committerJoey Sacchini <joey@sacchini.net>2020-12-07 18:39:15 -0500
commit317fe7da922303c9ecf3e8de4d202382067dc5a9 (patch)
tree4e281fc41405685d4a47cb830ed981d844104a4d
parentfb57b7dbc7ec4422e29c076a8b0fe777db660a69 (diff)
downloadcraftio-rs-317fe7da922303c9ecf3e8de4d202382067dc5a9.tar.gz
craftio-rs-317fe7da922303c9ecf3e8de4d202382067dc5a9.tar.bz2
craftio-rs-317fe7da922303c9ecf3e8de4d202382067dc5a9.zip
support generic associated types
-rw-r--r--Cargo.lock18
-rw-r--r--Cargo.toml5
-rw-r--r--src/connection.rs55
-rw-r--r--src/reader.rs80
4 files changed, 135 insertions, 23 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 3362efb..174db47 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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",
diff --git a/Cargo.toml b/Cargo.toml
index 45ae42d..61a9f60 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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);