rakata_formats/ltr/
writer.rs

1//! LTR binary writer.
2
3use std::io::{Cursor, Write};
4
5use crate::binary::{write_f32, write_u8};
6
7use super::{
8    Ltr, LtrBinaryError, LtrProbabilityBlock, LTR_CHARACTER_COUNT_U8, LTR_MAGIC, LTR_VERSION_V10,
9};
10
11/// Writes an LTR file to a writer.
12#[cfg_attr(
13    feature = "tracing",
14    tracing::instrument(level = "debug", skip(writer, ltr))
15)]
16pub fn write_ltr<W: Write>(writer: &mut W, ltr: &Ltr) -> Result<(), LtrBinaryError> {
17    writer.write_all(&LTR_MAGIC)?;
18    writer.write_all(&LTR_VERSION_V10)?;
19    write_u8(writer, LTR_CHARACTER_COUNT_U8)?;
20
21    write_block(writer, &ltr.singles)?;
22    for block in ltr.doubles.iter() {
23        write_block(writer, block)?;
24    }
25    for row in ltr.triples.iter() {
26        for block in row.iter() {
27            write_block(writer, block)?;
28        }
29    }
30
31    Ok(())
32}
33
34/// Serializes an LTR file into a byte vector.
35#[cfg_attr(feature = "tracing", tracing::instrument(level = "debug", skip(ltr)))]
36pub fn write_ltr_to_vec(ltr: &Ltr) -> Result<Vec<u8>, LtrBinaryError> {
37    let mut cursor = Cursor::new(Vec::new());
38    write_ltr(&mut cursor, ltr)?;
39    Ok(cursor.into_inner())
40}
41
42fn write_block<W: Write>(
43    writer: &mut W,
44    block: &LtrProbabilityBlock,
45) -> Result<(), LtrBinaryError> {
46    for chance in block
47        .start
48        .iter()
49        .chain(block.middle.iter())
50        .chain(block.end.iter())
51    {
52        write_f32(writer, *chance)?;
53    }
54    Ok(())
55}