ltk_meta 0.9.1

Metadata formats and utilities for League Toolkit
Documentation
use std::io;

use super::Bin;
use crate::BinKind;
use byteorder::{WriteBytesExt as _, LE};
use ltk_hash::WriteBytesExt as _;
use ltk_io_ext::WriterExt as _;

/// The version used when writing Bin files.
///
/// This is always version 3, which supports all features including
/// dependencies and data overrides.
pub const WRITE_VERSION: u32 = 3;

impl Bin {
    /// Write this bin to a writer.
    ///
    /// The output will always use version 3 format, regardless of the
    /// `version` field on this struct. This ensures maximum compatibility
    /// and feature support.
    ///
    /// # Arguments
    ///
    /// * `writer` - A writer that implements io::Write and io::Seek.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// use std::io::Cursor;
    /// use ltk_meta::Bin;
    ///
    /// let tree = Bin::default();
    /// let mut buffer = Cursor::new(Vec::new());
    /// tree.to_writer(&mut buffer)?;
    /// # Ok::<(), std::io::Error>(())
    /// ```
    pub fn to_writer<W: io::Write + io::Seek + ?Sized>(&self, writer: &mut W) -> io::Result<()> {
        writer.write_all(&BinKind::Prop.magic())?;

        // Always write version 3
        writer.write_u32::<LE>(WRITE_VERSION)?;
        writer.write_u32::<LE>(self.dependencies.len() as _)?;
        for dep in &self.dependencies {
            writer.write_len_prefixed_string::<LE, _>(dep)?;
        }

        writer.write_u32::<LE>(self.objects.len() as _)?;
        for obj in self.objects.values() {
            writer.write_bin_hash::<LE>(obj.class_hash)?;
        }
        for obj in self.objects.values() {
            obj.to_writer(writer)?;
        }

        Ok(())
    }
}