sea-schema-sync 0.17.0-rc.16

🌿 SQL schema definition and discovery
Documentation
use crate::postgres::{def::*, query::UniqueIndexQueryResult};

pub struct UniqueIndexQueryResultParser {
    curr: Option<UniqueIndexQueryResult>,
    results: Box<dyn Iterator<Item = UniqueIndexQueryResult>>,
}

pub fn parse_unique_index_query_results(
    results: Box<dyn Iterator<Item = UniqueIndexQueryResult>>,
) -> impl Iterator<Item = Unique> {
    UniqueIndexQueryResultParser {
        curr: None,
        results,
    }
}

impl Iterator for UniqueIndexQueryResultParser {
    type Item = Unique;

    fn next(&mut self) -> Option<Self::Item> {
        let result = if let Some(result) = self.curr.take() {
            result
        } else {
            self.results.next()?
        };

        let index_name = result.index_name;
        let mut columns = vec![result.column_name];
        let is_partial = result.is_partial;

        for result in self.results.by_ref() {
            if result.index_name != index_name {
                self.curr = Some(result);
                return Some(Unique {
                    name: index_name,
                    columns,
                    is_partial,
                });
            }

            columns.push(result.column_name);
        }

        Some(Unique {
            name: index_name,
            columns,
            is_partial,
        })
    }
}