fastnbt/ser/
write_nbt.rs

1use std::convert::TryInto;
2use std::io::Write;
3
4use byteorder::{BigEndian, WriteBytesExt};
5
6use crate::error::{Error, Result};
7use crate::Tag;
8
9pub(crate) trait WriteNbt: Write {
10    fn write_tag(&mut self, tag: Tag) -> Result<()> {
11        self.write_u8(tag as u8)?;
12        Ok(())
13    }
14
15    fn write_size_prefixed_str(&mut self, key: &str) -> Result<()> {
16        let key = cesu8::to_java_cesu8(key);
17        let len_bytes = key.len() as u16;
18        self.write_u16::<BigEndian>(len_bytes)?;
19        self.write_all(&key)?;
20        Ok(())
21    }
22
23    fn write_len(&mut self, len: usize) -> Result<()> {
24        self.write_u32::<BigEndian>(
25            len.try_into()
26                .map_err(|_| Error::bespoke("len too large".to_owned()))?,
27        )?;
28
29        Ok(())
30    }
31}
32
33impl<T> WriteNbt for T where T: Write {}