Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Traits & Interfaces

warcraft-rs does not define shared traits across crates. Each crate has its own parsing and I/O approach. This page documents the common patterns.

Parsing Patterns

Three parsing approaches are used across the workspace:

binrw Declarative (wow-adt, wow-wmo, wow-cdbc)

Uses derive macros for binary parsing:

#![allow(unused)]
fn main() {
use binrw::BinRead;

#[derive(BinRead, Debug)]
#[br(little)]
pub struct ChunkHeader {
    pub magic: [u8; 4],
    pub size: u32,
}
}

wow-adt and wow-wmo use binrw 0.14. wow-cdbc uses binrw 0.15.

Chunk Trait (wow-wdt)

Defines a Chunk trait that format-specific chunk types implement:

#![allow(unused)]
fn main() {
pub trait Chunk: Sized {
    fn magic() -> &'static [u8; 4];
    fn expected_size() -> Option<usize> { None }
    fn read(reader: &mut impl Read, size: usize) -> Result<Self>;
    fn write(&self, writer: &mut impl Write) -> Result<()>;
    fn size(&self) -> usize;
    fn write_chunk(&self, writer: &mut impl Write) -> Result<()> { /* default impl */ }
}
}

Hand-Written Readers (wow-mpq, wow-blp, wow-wdl, wow-m2)

Custom byte-level parsing using Read + Seek traits:

#![allow(unused)]
fn main() {
// wow-m2 uses a ReadExt trait
pub trait ReadExt: Read {
    fn read_u32_le(&mut self) -> io::Result<u32>;
    fn read_f32_le(&mut self) -> io::Result<f32>;
    // ...
}
}

Common API Patterns

Open/Parse Pattern

Most crates provide a way to parse from a reader or file:

#![allow(unused)]
fn main() {
// wow-mpq: static open method
let archive = Archive::open("archive.mpq")?;

// wow-wdt: reader struct
let reader = WdtReader::new(BufReader::new(file), WowVersion::WotLK);
let wdt = reader.read()?;

// wow-m2: parse_m2 returns M2Format (Legacy or Chunked variant)
let format = parse_m2(&mut reader)?;
let model = format.model();

// wow-adt: standalone function
let parsed = parse_adt(&mut reader)?;
}

Writer Pattern

Crates with write support provide builder or writer types:

#![allow(unused)]
fn main() {
// wow-mpq: OpenOptions with create method
let mut archive = OpenOptions::new().create("new.mpq")?;

// wow-wdt: WdtWriter wraps a writer
let writer = WdtWriter::new(&mut output);
writer.write(&wdt)?;

// wow-cdbc: DbcWriter wraps a writer
let writer = DbcWriter::new(&mut output);
}

See Also