fn next()

in azure-kusto-data/src/operations/query.rs [212:275]


    fn next(&mut self) -> Option<Self::Item> {
        if self.finished {
            return None;
        }
        let next_table = self.tables.find_map(|t| match t {
            V2QueryResult::DataTable(_) | V2QueryResult::TableHeader(_) => Some(t),
            _ => None,
        });

        if let Some(V2QueryResult::DataTable(t)) = next_table {
            return Some(t);
        }

        let mut table = DataTable {
            table_id: 0,
            table_name: "".to_string(),
            table_kind: TableKind::Unknown,
            columns: vec![],
            rows: vec![],
        };

        if let Some(V2QueryResult::TableHeader(header)) = next_table {
            table.table_id = header.table_id;
            table.table_kind = header.table_kind;
            table.table_name = header.table_name;
            table.columns = header.columns;
        } else {
            self.finished = true;
            return None;
        }

        let mut finished_table = false;

        for result in &mut self.tables {
            match result {
                V2QueryResult::TableFragment(fragment) => {
                    assert_eq!(fragment.table_id, table.table_id);
                    match fragment.table_fragment_type {
                        TableFragmentType::DataAppend => table.rows.extend(fragment.rows),
                        TableFragmentType::DataReplace => table.rows = fragment.rows,
                    };
                }
                V2QueryResult::TableProgress(progress) => {
                    assert_eq!(progress.table_id, table.table_id);
                }
                V2QueryResult::TableCompletion(completion) => {
                    assert_eq!(completion.table_id, table.table_id);
                    assert_eq!(
                        completion.row_count,
                        TryInto::<i32>::try_into(table.rows.len()).expect("Row count overflow")
                    );
                    finished_table = true;
                    break;
                }
                _ => unreachable!("Unexpected result type"),
            }
        }

        if finished_table {
            Some(table)
        } else {
            None
        }
    }