aboutsummaryrefslogtreecommitdiff
path: root/minecraft-protocol/src/mc_buf.rs
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2021-12-07 20:04:35 +0000
committermat <github@matdoes.dev>2021-12-07 20:04:35 +0000
commit500754eab0bb99e6bd1769ddd999241ce26b5f91 (patch)
treeab4f84b7a227fc3eedd3d253f866eb086f3617cf /minecraft-protocol/src/mc_buf.rs
parentfcaca28ff1d2cb54c9139941d4075676ca46c6e8 (diff)
downloadazalea-drasl-500754eab0bb99e6bd1769ddd999241ce26b5f91.tar.xz
reading packet almost complete
Diffstat (limited to 'minecraft-protocol/src/mc_buf.rs')
-rw-r--r--minecraft-protocol/src/mc_buf.rs12
1 files changed, 7 insertions, 5 deletions
diff --git a/minecraft-protocol/src/mc_buf.rs b/minecraft-protocol/src/mc_buf.rs
index 6c2b9f1b..f657626f 100644
--- a/minecraft-protocol/src/mc_buf.rs
+++ b/minecraft-protocol/src/mc_buf.rs
@@ -11,6 +11,7 @@ use tokio::io::{AsyncRead, AsyncReadExt, BufReader};
const MAX_STRING_LENGTH: u16 = 32767;
// const MAX_COMPONENT_STRING_LENGTH: u32 = 262144;
+/// Read a single byte from the reader
pub async fn read_byte<T: AsyncRead + std::marker::Unpin>(
buf: &mut BufReader<T>,
) -> Result<u8, String> {
@@ -29,9 +30,10 @@ pub fn write_bytes(buf: &mut Vec<u8>, bytes: &[u8]) {
}
// fast varints stolen from https://github.com/luojia65/mc-varint/blob/master/src/lib.rs#L67
+/// Read a single varint from the reader and return the value, along with the number of bytes read
pub async fn read_varint<T: AsyncRead + std::marker::Unpin>(
buf: &mut BufReader<T>,
-) -> Result<u32, String> {
+) -> Result<(u32, u8), String> {
let mut buffer = [0];
let mut ans = 0;
for i in 0..4 {
@@ -40,10 +42,10 @@ pub async fn read_varint<T: AsyncRead + std::marker::Unpin>(
.or_else(|_| Err("Invalid VarInt".to_string()))?;
ans |= ((buffer[0] & 0b0111_1111) as u32) << 7 * i;
if buffer[0] & 0b1000_0000 == 0 {
- break;
+ return Ok((ans, i + 1));
}
}
- Ok(ans)
+ Ok((ans, 5))
}
pub fn write_varint(buf: &mut Vec<u8>, mut value: u32) {
@@ -71,13 +73,13 @@ mod tests {
#[tokio::test]
async fn test_read_varint() {
let mut buf = BufReader::new(Cursor::new(vec![192, 196, 7]));
- assert_eq!(read_varint(&mut buf).await.unwrap(), 123456);
+ assert_eq!(read_varint(&mut buf).await.unwrap(), (123456, 3));
}
#[tokio::test]
async fn test_read_varint_longer() {
let mut buf = BufReader::new(Cursor::new(vec![138, 56, 0, 135, 56, 123]));
- assert_eq!(read_varint(&mut buf).await.unwrap(), 7178);
+ assert_eq!(read_varint(&mut buf).await.unwrap(), (7178, 2));
}
}