Skip to main content

lutra_bin/table/
iterate.rs

1use super::Table;
2use crate::ir;
3use crate::{TableCell, TupleReader};
4
5impl<'d, 't> Iterator for Table<'d, 't> {
6    type Item = Vec<TableCell<'d, 't>>;
7
8    fn next(&mut self) -> Option<Self::Item> {
9        let row = self.reader.next()?;
10        Some(self.flatten_row(row))
11    }
12}
13
14impl<'d, 't> Table<'d, 't> {
15    fn flatten_row(&self, cells: Vec<TableCell<'d, 't>>) -> Vec<TableCell<'d, 't>> {
16        let mut leaves = Vec::new();
17        for cell in cells {
18            self.flatten_cell(cell, &mut leaves);
19        }
20        leaves
21    }
22
23    fn flatten_cell(&self, cell: TableCell<'d, 't>, out: &mut Vec<TableCell<'d, 't>>) {
24        let ty = self.get_ty_mat(cell.ty());
25        match &ty.kind {
26            ir::TyKind::Tuple(fields) => {
27                let reader = TupleReader::new_for_ty(cell.data(), ty);
28                for (i, field) in fields.iter().enumerate() {
29                    let field_data: &'d [u8] = reader.get_field(i);
30                    let field_cell = TableCell::new(field_data, &field.ty, cell.ty_defs());
31                    self.flatten_cell(field_cell, out);
32                }
33            }
34            _ => {
35                // Leaf: primitive, array, or enum
36                out.push(cell);
37            }
38        }
39    }
40}