azalea_protocol/common/
tags.rs1use std::{
2 io::{self, Cursor, Write},
3 ops::Deref,
4};
5
6use azalea_buf::{AzBuf, AzBufVar, BufReadError};
7use azalea_registry::identifier::Identifier;
8use indexmap::IndexMap;
9
10#[derive(Clone, Debug, PartialEq)]
11pub struct TagMap(pub IndexMap<Identifier, Vec<Tags>>);
12
13#[derive(Clone, Debug, PartialEq)]
14pub struct Tags {
15 pub name: Identifier,
16 pub elements: Vec<i32>,
17}
18
19impl AzBuf for TagMap {
20 fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
21 let length = u32::azalea_read_var(buf)? as usize;
22 let mut data = IndexMap::new();
23 for _ in 0..length {
24 let tag_type = Identifier::azalea_read(buf)?;
25 let tags_count = i32::azalea_read_var(buf)? as usize;
26 let mut tags_vec = Vec::new();
27 for _ in 0..tags_count {
28 let tags = Tags::azalea_read(buf)?;
29 tags_vec.push(tags);
30 }
31 data.insert(tag_type, tags_vec);
32 }
33 Ok(TagMap(data))
34 }
35 fn azalea_write(&self, buf: &mut impl Write) -> io::Result<()> {
36 (self.len() as u32).azalea_write_var(buf)?;
37 for (k, v) in &self.0 {
38 k.azalea_write(buf)?;
39 v.azalea_write(buf)?;
40 }
41 Ok(())
42 }
43}
44impl AzBuf for Tags {
45 fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> {
46 let name = Identifier::azalea_read(buf)?;
47 let elements = Vec::<i32>::azalea_read_var(buf)?;
48 Ok(Tags { name, elements })
49 }
50 fn azalea_write(&self, buf: &mut impl Write) -> io::Result<()> {
51 self.name.azalea_write(buf)?;
52 self.elements.azalea_write_var(buf)?;
53 Ok(())
54 }
55}
56
57impl Deref for TagMap {
58 type Target = IndexMap<Identifier, Vec<Tags>>;
59
60 fn deref(&self) -> &Self::Target {
61 &self.0
62 }
63}