//! fastnbt aims for fast deserializing of NBT data from *Minecraft: Java
//! Edition*. This format is used by the game to store various things, such as
//! the world data and player inventories.
//!
//! * For documentation and examples of serde deserialization, see [`de`].
//! * For a `serde_json`-like `Value` type see [`Value`].
//! * For NBT array types see [`ByteArray`], [`IntArray`], and [`LongArray`].
//! * For 'zero-copy' NBT array types see [`borrow`].
//!
//! Both this and related crates are under one [fastnbt Github
//! repository](https://github.com/owengage/fastnbt)
//!
//! ```toml
//! [dependencies]
//! fastnbt = "1"
//! ```
//!
//! # Byte, Int and Long array types
//!
//! There are three array types in NBT. To capture these, use [`ByteArray`],
//! [`IntArray`], and [`LongArray`]. These NBT types do not deserialize straight
//! into serde sequences like `Vec` in order to preserve the information from
//! the original NBT. Without these types, it is not possible to tell if some
//! data came from a NBT List or an NBT Array.
//!
//! Use these in your own data structures. They all implement
//! [`Deref`][`std::ops::Deref`] for dereferencing into the underlying `Vec`.
//!
//! For versions that borrow their data, see [`borrow`]. For more information
//! about deserialization see [`de`].
//!
//! An example of deserializing a section of a chunk:
//!
//! ```no_run
//! use fastnbt::LongArray;
//! use serde::Deserialize;
//!
//! #[derive(Deserialize)]
//! #[serde(rename_all = "PascalCase")]
//! pub struct Section {
//! pub block_states: Option<LongArray>,
//! pub y: i8,
//! }
//!
//!# fn main(){
//! let buf: &[u8] = unimplemented!("get a buffer from somewhere");
//! let section: Section = fastnbt::de::from_bytes(buf).unwrap();
//! let states = section.block_states.unwrap();
//!
//! for long in states.iter() {
//! // do something
//! }
//! # }
//! ```
//!
//! # Example: Player inventory
//!
//! This example demonstrates printing out a players inventory and ender chest
//! contents from the [player dat
//! files](https://minecraft.gamepedia.com/Player.dat_format) found in worlds.
//!
//! Here we
//! * use serde's renaming attributes to have rustfmt conformant field names,
//! * use lifetimes to save on some string allocations (see [`de`] for more
//! info), and
//! * use the `Value` type to deserialize a field we don't know the exact
//! structure of.
//!
//!```no_run
//! use std::borrow::Cow;
//! use fastnbt::error::Result;
//! use fastnbt::{de::from_bytes, Value};
//! use flate2::read::GzDecoder;
//! use serde::Deserialize;
//! use std::io::Read;
//!
//! #[derive(Deserialize, Debug)]
//! #[serde(rename_all = "PascalCase")]
//! struct PlayerDat<'a> {
//! data_version: i32,
//!
//! #[serde(borrow)]
//! inventory: Vec<InventorySlot<'a>>,
//! ender_items: Vec<InventorySlot<'a>>,
//! }
//!
//! #[derive(Deserialize, Debug)]
//! struct InventorySlot<'a> {
//! // We typically avoid allocating a string here.
//! // See `fastnbt::de` docs for more info.
//! id: Cow<'a, str>,
//!
//! // Also get the less structured properties of the object.
//! tag: Option<Value>,
//!
//! // We need to rename fields a lot.
//! #[serde(rename = "Count")]
//! count: i8,
//! }
//!
//!# fn main() {
//! let args: Vec<_> = std::env::args().skip(1).collect();
//! let file = std::fs::File::open(args[0].clone()).unwrap();
//!
//! // Player dat files are compressed with GZip.
//! let mut decoder = GzDecoder::new(file);
//! let mut data = vec![];
//! decoder.read_to_end(&mut data).unwrap();
//!
//! let player: Result<PlayerDat> = from_bytes(data.as_slice());
//!
//! println!("{:#?}", player);
//!# }
//! ```
//!
//! # `Read` based parser
//!
//! A lower level parser also exists in the `stream` module that only requires
//! the `Read` trait on the input. This parser however doesn't support
//! deserializing to Rust objects directly.
//!
use Deserialize;
pub use *;
pub use *;
pub
use ;
/// An NBT tag. This does not carry the value or the name of the data.
pub const BYTE_ARRAY_TAG: u8 = 7;
pub const INT_ARRAY_TAG: u8 = 11;
pub const LONG_ARRAY_TAG: u8 = 12;
// Crates exist to generate this code for us, but would add to our compile
// times, so we instead right it out manually, the tags will very rarely change
// so isn't a massive burden, but saves a significant amount of compile time.
/// Compile time NBT tag type. Useful for forcing a custom type to have a field
/// that must be a given tag. Used for the Array types.
pub ;