Skip to main content

brink_format/inkl/
write.rs

1//! Encoding (write) half of the `.inkl` locale overlay format.
2
3use crate::codec::{write_def_id, write_str, write_u8, write_u16, write_u32};
4use crate::definition::LocaleData;
5use crate::inkb::write::encode_line_content;
6
7use super::{INKL_MAGIC, INKL_VERSION};
8
9/// Encode a [`LocaleData`] into the `.inkl` binary format.
10#[expect(clippy::cast_possible_truncation)]
11pub fn write_inkl(data: &LocaleData, buf: &mut Vec<u8>) {
12    // Header
13    buf.extend_from_slice(INKL_MAGIC);
14    write_u8(buf, INKL_VERSION);
15    write_u32(buf, data.base_checksum);
16    write_u16(buf, data.locale_tag.len() as u16);
17    buf.extend_from_slice(data.locale_tag.as_bytes());
18
19    // Line tables payload
20    write_u32(buf, data.line_tables.len() as u32);
21    for scope in &data.line_tables {
22        write_def_id(buf, scope.scope_id);
23        write_u32(buf, scope.lines.len() as u32);
24        for entry in &scope.lines {
25            encode_line_content(&entry.content, buf);
26            match &entry.audio_ref {
27                Some(audio) => {
28                    write_u8(buf, 1);
29                    write_str(buf, audio);
30                }
31                None => {
32                    write_u8(buf, 0);
33                }
34            }
35        }
36    }
37}