From e5fcfa119309877ab515b921f8ada5f1b1ec4c30 Mon Sep 17 00:00:00 2001 From: mat Date: Tue, 26 Apr 2022 15:33:41 +0000 Subject: default implementation for read and write Vec --- azalea-protocol/src/mc_buf/read.rs | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) (limited to 'azalea-protocol/src/mc_buf/read.rs') diff --git a/azalea-protocol/src/mc_buf/read.rs b/azalea-protocol/src/mc_buf/read.rs index 1e7db1dd..4c126b7e 100755 --- a/azalea-protocol/src/mc_buf/read.rs +++ b/azalea-protocol/src/mc_buf/read.rs @@ -1,4 +1,3 @@ -use crate::mc_buf::ByteArray; use async_trait::async_trait; use azalea_chat::component::Component; use azalea_core::{ @@ -8,7 +7,7 @@ use azalea_core::{ use serde::Deserialize; use tokio::io::{AsyncRead, AsyncReadExt}; -use super::MAX_STRING_LENGTH; +use super::{UnsizedByteArray, MAX_STRING_LENGTH}; #[async_trait] pub trait Readable { @@ -16,7 +15,7 @@ pub trait Readable { async fn read_varint(&mut self) -> Result; fn get_varint_size(&mut self, value: i32) -> u8; fn get_varlong_size(&mut self, value: i32) -> u8; - async fn read_byte_array(&mut self) -> Result; + async fn read_byte_array(&mut self) -> Result, String>; async fn read_bytes_with_len(&mut self, n: usize) -> Result, String>; async fn read_bytes(&mut self) -> Result, String>; async fn read_utf(&mut self) -> Result; @@ -82,9 +81,9 @@ where 10 } - async fn read_byte_array(&mut self) -> Result { + async fn read_byte_array(&mut self) -> Result, String> { let length = self.read_varint().await? as usize; - Ok(ByteArray(self.read_bytes_with_len(length).await?)) + self.read_bytes_with_len(length).await } async fn read_bytes_with_len(&mut self, n: usize) -> Result, String> { @@ -244,22 +243,27 @@ impl McBufVarintReadable for i32 { } #[async_trait] -impl McBufReadable for Vec { +impl McBufReadable for UnsizedByteArray { async fn read_into(buf: &mut R) -> Result where R: AsyncRead + std::marker::Unpin + std::marker::Send, { - buf.read_bytes().await + Ok(UnsizedByteArray(buf.read_bytes().await?)) } } #[async_trait] -impl McBufReadable for ByteArray { +impl McBufReadable for Vec { async fn read_into(buf: &mut R) -> Result where R: AsyncRead + std::marker::Unpin + std::marker::Send, { - buf.read_byte_array().await + let length = buf.read_varint().await? as usize; + let mut contents = Vec::with_capacity(length); + for _ in 0..length { + contents.push(T::read_into(buf).await?); + } + Ok(contents) } } @@ -417,22 +421,6 @@ impl McBufReadable for Option { } } -// Vec -#[async_trait] -impl McBufReadable for Vec { - async fn read_into(buf: &mut R) -> Result - where - R: AsyncRead + std::marker::Unpin + std::marker::Send, - { - let mut vec = Vec::new(); - let length = buf.read_varint().await?; - for _ in 0..length { - vec.push(buf.read_resource_location().await?); - } - Ok(vec) - } -} - // azalea_nbt::Tag #[async_trait] impl McBufReadable for azalea_nbt::Tag { -- cgit v1.2.3