sea_schema/postgres/parser/
pg_indexes.rs

1use crate::postgres::{def::*, query::UniqueIndexQueryResult};
2
3pub struct UniqueIndexQueryResultParser {
4    curr: Option<UniqueIndexQueryResult>,
5    results: Box<dyn Iterator<Item = UniqueIndexQueryResult>>,
6}
7
8pub fn parse_unique_index_query_results(
9    results: Box<dyn Iterator<Item = UniqueIndexQueryResult>>,
10) -> impl Iterator<Item = Unique> {
11    UniqueIndexQueryResultParser {
12        curr: None,
13        results,
14    }
15}
16
17impl Iterator for UniqueIndexQueryResultParser {
18    type Item = Unique;
19
20    fn next(&mut self) -> Option<Self::Item> {
21        let result = if let Some(result) = self.curr.take() {
22            result
23        } else {
24            self.results.next()?
25        };
26
27        let index_name = result.index_name;
28        let mut columns = vec![result.column_name];
29
30        for result in self.results.by_ref() {
31            if result.index_name != index_name {
32                self.curr = Some(result);
33                return Some(Unique {
34                    name: index_name,
35                    columns,
36                });
37            }
38
39            columns.push(result.column_name);
40        }
41
42        Some(Unique {
43            name: index_name,
44            columns,
45        })
46    }
47}