gioser

tawasuyu/brahman

Rust 226TOML 67JSON 14HTML 12860 Definiciones

⎇ main crates/modules/charka/charka-shadow/src/field.rs Rust · 34 líneas · 1.1 KB Historia Quién tocó qué crudo

feat(charka): OCCURS — tablas y referencias con subíndice 3902763da · sergio ·

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}