azalea-buf 0.16.0+mc26.1

Serialize and deserialize buffers from Minecraft.
Documentation
#![doc = include_str!("../README.md")]
#![feature(min_specialization)]
// this is necessary for thiserror backtraces
#![feature(error_generic_member_access)]

mod definitions;
pub mod impls;
mod serializable_uuid;

pub use azalea_buf_macros::*;
pub use definitions::*;
pub use impls::*;
pub use serializable_uuid::*;

// const DEFAULT_NBT_QUOTA: u32 = 2097152;
const MAX_STRING_LENGTH: u32 = 32767;
// const MAX_COMPONENT_STRING_LENGTH: u32 = 262144;

#[cfg(test)]
mod tests {
    use std::{collections::HashMap, io::Cursor};

    use super::*;

    #[test]
    fn test_write_varint() {
        let mut buf = Vec::new();
        0.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![0]);

        let mut buf = Vec::new();
        1.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![1]);

        let mut buf = Vec::new();
        2.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![2]);

        let mut buf = Vec::new();
        127.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![127]);

        let mut buf = Vec::new();
        128.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![128, 1]);

        let mut buf = Vec::new();
        255.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![255, 1]);

        let mut buf = Vec::new();
        25565.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![221, 199, 1]);

        let mut buf = Vec::new();
        2097151.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![255, 255, 127]);

        let mut buf = Vec::new();
        2147483647.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![255, 255, 255, 255, 7]);

        let mut buf = Vec::new();
        (-1).azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![255, 255, 255, 255, 15]);

        let mut buf = Vec::new();
        (-2147483648).azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![128, 128, 128, 128, 8]);
    }

    #[test]
    fn test_read_varint() {
        // let buf = &mut &vec![0][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 0);
        let buf = vec![0];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 0);

        // let buf = &mut &vec![1][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 1);
        let buf = vec![1];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 1);

        // let buf = &mut &vec![2][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2);
        let buf = vec![2];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 2);

        // let buf = &mut &vec![127][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 127);
        let buf = vec![127];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 127);

        // let buf = &mut &vec![128, 1][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 128);
        let buf = vec![128, 1];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 128);

        // let buf = &mut &vec![255, 1][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 255);
        let buf = vec![255, 1];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 255);

        // let buf = &mut &vec![221, 199, 1][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 25565);
        let buf = vec![221, 199, 1];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 25565);

        // let buf = &mut &vec![255, 255, 127][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2097151);
        let buf = vec![255, 255, 127];
        assert_eq!(
            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
            2097151
        );

        // let buf = &mut &vec![255, 255, 255, 255, 7][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), 2147483647);
        let buf = vec![255, 255, 255, 255, 7];
        assert_eq!(
            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
            2147483647
        );

        // let buf = &mut &vec![255, 255, 255, 255, 15][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), -1);
        let buf = vec![255, 255, 255, 255, 15];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), -1);

        // let buf = &mut &vec![128, 128, 128, 128, 8][..];
        // assert_eq!(i32::azalea_read_var(buf).unwrap(), -2147483648);
        let buf = vec![128, 128, 128, 128, 8];
        assert_eq!(
            i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(),
            -2147483648
        );
    }

    #[test]
    fn test_read_varint_longer() {
        let buf = vec![138, 56, 0, 135, 56, 123];
        assert_eq!(i32::azalea_read_var(&mut Cursor::new(&buf)).unwrap(), 7178);
    }

    #[test]
    fn test_write_varlong() {
        let mut buf = Vec::new();
        0u64.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![0]);

        let mut buf = Vec::new();
        1u64.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![1]);

        let mut buf = Vec::new();
        9223372036854775807u64.azalea_write_var(&mut buf).unwrap();
        assert_eq!(buf, vec![255, 255, 255, 255, 255, 255, 255, 255, 127]);
    }

    #[test]
    fn test_list() {
        let original_vec = vec!["a".to_owned(), "bc".to_owned(), "def".to_owned()];

        let mut buf = Vec::new();
        original_vec.azalea_write(&mut buf).unwrap();

        dbg!(&buf);

        let result = Vec::<String>::azalea_read(&mut Cursor::new(&buf)).unwrap();
        assert_eq!(result, original_vec);
    }

    #[test]
    fn test_int_id_list() {
        let mut buf = Vec::new();
        vec![1, 2, 3].azalea_write_var(&mut buf).unwrap();

        let result = Vec::<i32>::azalea_read_var(&mut Cursor::new(&buf)).unwrap();
        assert_eq!(result, vec![1, 2, 3]);
    }

    #[test]
    fn test_map() {
        let original_map = HashMap::from([
            ("a".to_owned(), 1),
            ("bc".to_owned(), 23),
            ("def".to_owned(), 456),
        ]);
        let mut buf = Vec::new();
        original_map.azalea_write_var(&mut buf).unwrap();

        let result = HashMap::<String, i32>::azalea_read_var(&mut Cursor::new(&buf)).unwrap();

        assert_eq!(result, original_map);
    }

    #[test]
    fn test_long() {
        let mut buf: Vec<u8> = Vec::new();
        123456u64.azalea_write(&mut buf).unwrap();

        assert_eq!(u64::azalea_read(&mut Cursor::new(&buf)).unwrap(), 123456);
    }
}