lutra_bin/table/
iterate.rs1use 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 out.push(cell);
37 }
38 }
39 }
40}