use std::collections::HashMap;
use serde::Serialize;
use crate::traits::SizeOf;
#[derive(Debug, Clone)]
pub enum NbtValue {
Byte(i8),
Short(i16),
Int(i32),
Long(i64),
Float(f32),
Double(f64),
ByteArray(Vec<i8>),
String(String),
List(Vec<NbtValue>),
Compound(Option<String>, HashMap<String, NbtValue>),
IntArray(Vec<i32>),
LongArray(Vec<i64>),
}
impl NbtValue {
pub(crate) fn number_as_be_bytes(&self) -> Option<Vec<u8>> {
match *self {
Self::Byte(v) => Some(vec![v as u8]),
Self::Short(v) => Some(v.to_be_bytes().to_vec()),
Self::Int(v) => Some(v.to_be_bytes().to_vec()),
Self::Long(v) => Some(v.to_be_bytes().to_vec()),
Self::Float(v) => Some(v.to_be_bytes().to_vec()),
Self::Double(v) => Some(v.to_be_bytes().to_vec()),
_ => None,
}
}
}
impl SizeOf for NbtValue {
fn size_of(&self) -> usize {
match self {
Self::Byte(_) => std::mem::size_of::<i8>(),
Self::Short(_) => std::mem::size_of::<i16>(),
Self::Int(_) => std::mem::size_of::<i32>(),
Self::Long(_) => std::mem::size_of::<i64>(),
Self::Float(_) => std::mem::size_of::<f32>(),
Self::Double(_) => std::mem::size_of::<f64>(),
Self::ByteArray(v) => v.len() * std::mem::size_of::<i8>(),
Self::IntArray(v) => v.len() * std::mem::size_of::<i32>(),
Self::LongArray(v) => v.len() * std::mem::size_of::<i64>(),
Self::String(s) => std::mem::size_of_val(s),
Self::List(v) => v.iter().map(|v|v.size_of()).sum(),
Self::Compound(_, values) => values.iter().map(|(k,v)|std::mem::size_of_val(k) + v.size_of()).sum(),
}
}
}
pub fn to_nbt_value<T>(value: T) -> Result<NbtValue, crate::error::Error>
where
T: Serialize,
{
value.serialize(&mut ser::Serializer)
}
pub mod ser;
pub mod de;
pub mod array_serializer;