Skip to main content

brink_format/inkl/
write.rs

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