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 {}