feat(charka): OCCURS — tablas y referencias con subíndice
1//! El estado de los datos durante la ejecución sombra: el modelo de
2//! datos resuelto de `charka-ir` se materializa en campos vivos.
3
4use std::collections::HashMap;
5
6use charka_ir::{DataModel, FieldKind};
7use charka_runtime::{Num, Picture, Text};
8
9/// Un campo vivo. Todo campo es un vector: un dato escalar es un
10/// vector de un elemento; una tabla (`OCCURS n`) es de `n` elementos.
11pub(crate) enum Cell {
12 Num(Vec<Num>),
13 Text(Vec<Text>),
14}
15
16/// Materializa los campos del modelo en un mapa `nombre → campo`.
17pub(crate) fn build_fields(model: &DataModel) -> HashMap<String, Cell> {
18 let mut map = HashMap::new();
19 for f in &model.fields {
20 let n = f.occurs.unwrap_or(1).max(1) as usize;
21 let cell = match f.kind {
22 FieldKind::Num { int, frac, signed } => Cell::Num(vec![
23 Num::with_value(
24 Picture::new(int, frac, signed),
25 &f.init
26 );
27 n
28 ]),
29 FieldKind::Text { len } => Cell::Text(vec![Text::with_value(len, &f.init); n]),
30 };
31 map.entry(f.name.clone()).or_insert(cell);
32 }
33 map
34}