# valence_nbt

A library for encoding and decoding Minecraft's [Named Binary Tag] (NBT)
format.

[Named Binary Tag]: https://minecraft.fandom.com/wiki/NBT_format

# Examples

Encode NBT data to its binary form. We are using the [`compound!`] macro to
conveniently construct [`Compound`] values.

```rust
use valence_nbt::{compound, to_binary_writer, List};

let c = compound! {
    "byte" => 5_i8,
    "string" => "hello",
    "list_of_float" => List::Float(vec![
        3.1415,
        2.7182,
        1.4142
    ]),
};

let mut buf = vec![];

to_binary_writer(&mut buf, &c, "").unwrap();
```

Decode NBT data from its binary form.

```rust
use valence_nbt::{compound, from_binary_slice};

let some_bytes = [10, 0, 0, 3, 0, 3, 105, 110, 116, 0, 0, 222, 173, 0];

let expected_value = compound! {
    "int" => 0xdead
};

let (nbt, root_name) = from_binary_slice(&mut some_bytes.as_slice()).unwrap();

assert_eq!(nbt, expected_value);
assert_eq!(root_name, "");
```

# Features

- `preserve_order`: Causes the order of fields in [`Compound`]s to be
preserved during insertion and deletion at a slight cost to performance.
The iterators on `Compound` can then implement [`DoubleEndedIterator`].