rakata_formats/ltr/
writer.rs1use 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#[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(<R_MAGIC)?;
18 writer.write_all(<R_VERSION_V10)?;
19 write_u8(writer, LTR_CHARACTER_COUNT_U8)?;
20
21 write_block(writer, <r.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#[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}