Skip to content

CrabCraftDev/CrabNBT

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

86 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ¦€ CrabNBT

Up-to-date Rust crate for easy and intuitive working with NBT data.

Why not other libraries?

CrabNBT combines best features of existing NBT crates, to create perfect, easy to use solution.
Big thanks to simdnbt and fastnbt for ideas!

Features

βœ… Support for serializing to/from Struct (serde)
βœ… Java string support
βœ… nbt! macro for easy creation
βœ… Easy to use system of retrieving values from NBT
βœ… Serialization support for individual tags
βœ… Support for Network NBT

Installing

cargo add crab_nbt

Serializing

use crab_nbt::{nbt, Nbt, NbtCompound};

// Using NBT macro
let nbt = nbt!("root nbt_inner name", {
    "float": 1.0,
    "key": "value",
    "long_array": [L; 1, 2],
    "int_array": [Int; 1, 10, 25],
    "byte_array": [B; 0, 1, 0, 0, 1],
    "list": ["a", "b", "c"],
    "nbt_inner": {
        "key": "sub value"
    }
});

let nbt = Nbt::new(
    "root".to_owned(),
    NbtCompound::from_iter([
        ("float".to_owned(), 1.0.into()),
        ("key".to_owned(), "value".into()),
        ("nbt_inner".to_owned(), NbtCompound::from_iter([
            ("key".to_owned(), "sub value".into()),
        ]).into())
    ])
);

let network_bytes = nbt.write_unnamed();
let normal_bytes = nbt.write();

Deserializing

use bytes::Bytes;
use crab_nbt::{nbt, Nbt, NbtCompound};

fn example(bytes: &mut Bytes) {
    let nbt = Nbt::read(bytes).unwrap();
    let egg_name = nbt
        .get_compound("nbt_inner")
        .and_then(|compound| compound.get_compound("egg"))
        .and_then(|compound| compound.get_string("name"))
        .unwrap();
}

Serde

Requires serde feature.

use crab_nbt::serde::{arrays::IntArray, ser::to_bytes_unnamed, de::from_bytes_unnamed};
use crab_nbt::serde::bool::deserialize_bool;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Test {
    number: i32,
    #[serde(with = "IntArray")]
    int_array: Vec<i32>,
    /// Using [deserialize_bool] is required only if
    /// you are using `#[serde(flatten)]` attribute 
    #[serde(deserialize_with = "deserialize_bool")]
    bool: bool
}

fn cycle() {
    let test = Test {
        number: 5,
        int_array: vec![7, 8],
        bool: false
    };
    let mut bytes = to_bytes_unnamed(&test).unwrap();
    let recreated_struct: Test = from_bytes_unnamed(&mut bytes).unwrap();
    
    assert_eq!(test, recreated_struct);
}

Feature flags

  • serde - Serde integration.
  • macro - The nbt! macro for easy creation of compounds with json like syntax.
  • nightly - Additional performance optimizations that require the nightly Rust toolchain.

About

πŸ“œ Up-to-date Rust crate for easy and intuitive working with NBT data.

Topics

Resources

License

Stars

Watchers

Forks

Contributors 3

  •  
  •  
  •  

Languages