use std::io::{Read, Write};
use fastnbt::{DeOpts, SerOpts};
use mcproto_codec::error::{CodecError, CodecKind, CodecOperation, InvalidEncodingReason};
use crate::TypeCodec;
#[derive(Debug, Clone, PartialEq)]
pub struct Nbt(
pub fastnbt::Value,
);
impl TypeCodec for Nbt {
fn encode(&self, writer: &mut impl Write) -> Result<(), CodecError> {
fastnbt::to_writer_with_opts(writer, &self.0, SerOpts::network_nbt())
.map_err(|source| invalid_nbt(CodecOperation::Write, source))
}
fn decode(reader: &mut impl Read) -> Result<Self, CodecError> {
fastnbt::from_reader_with_opts(reader, DeOpts::network_nbt())
.map(Self)
.map_err(|source| invalid_nbt(CodecOperation::Read, source))
}
}
fn invalid_nbt(operation: CodecOperation, source: fastnbt::error::Error) -> CodecError {
CodecError::invalid_encoding_for_operation_with_source(
CodecKind::Nbt,
operation,
0,
InvalidEncodingReason::InvalidNbt,
source,
)
}