use crate::{decode_var_int, encode_var_int, ClassName, Error, Value, VarInt};
use std::io::{Read, Seek};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Object {
class_name_index: VarInt,
values_index: VarInt,
value_count: VarInt,
}
impl Object {
pub(crate) fn try_from_reader<T: Read + Seek>(mut reader: &mut T) -> Result<Self, Error> {
Ok(Self {
class_name_index: decode_var_int(&mut reader)?,
values_index: decode_var_int(&mut reader)?,
value_count: decode_var_int(&mut reader)?,
})
}
pub(crate) fn to_bytes(&self) -> Vec<u8> {
let mut bytes = encode_var_int(self.class_name_index);
bytes.append(&mut encode_var_int(self.values_index));
bytes.append(&mut encode_var_int(self.value_count));
bytes
}
pub fn new(class_name_index: VarInt, values_index: VarInt, value_count: VarInt) -> Self {
Self {
class_name_index,
values_index,
value_count,
}
}
pub fn class_name_index(&self) -> VarInt {
self.class_name_index
}
pub fn set_class_name_index(&mut self, index: VarInt) {
self.class_name_index = index
}
pub fn values_index(&self) -> VarInt {
self.values_index
}
pub fn set_values_index(&mut self, index: VarInt) {
self.values_index = index
}
pub fn value_count(&self) -> VarInt {
self.value_count
}
pub fn set_value_count(&mut self, count: VarInt) {
self.value_count = count
}
pub fn values<'a>(&self, values: &'a [Value]) -> &'a [Value] {
let start = self.values_index() as usize;
let end = start + self.value_count() as usize;
&values[start..end]
}
pub fn class_name<'a>(&self, class_names: &'a [ClassName]) -> &'a ClassName {
&class_names[self.class_name_index() as usize]
}
pub fn into_inner(self) -> (VarInt, VarInt, VarInt) {
(self.class_name_index, self.values_index, self.value_count)
}
}