Skip to main content

vantage_table/column/
collection.rs

1use std::sync::Arc;
2
3use indexmap::IndexMap;
4
5use crate::{column::flags::ColumnFlag, traits::column_like::ColumnLike};
6
7/// Filter a column collection by flag; the filters chain.
8///
9/// ```rust,ignore
10/// let visible_mandatory = table.columns()
11///     .exclude(ColumnFlag::Hidden)
12///     .only(ColumnFlag::Mandatory);
13/// ```
14pub trait ColumnCollectionExt {
15    /// A new collection of only the columns that have `flag`.
16    fn only(&self, flag: ColumnFlag) -> Arc<IndexMap<String, Arc<dyn ColumnLike>>>;
17
18    /// A new collection of only the columns that do not have `flag`.
19    fn exclude(&self, flag: ColumnFlag) -> Arc<IndexMap<String, Arc<dyn ColumnLike>>>;
20}
21
22impl ColumnCollectionExt for Arc<IndexMap<String, Arc<dyn ColumnLike>>> {
23    fn only(&self, flag: ColumnFlag) -> Arc<IndexMap<String, Arc<dyn ColumnLike>>> {
24        let filtered: IndexMap<String, Arc<dyn ColumnLike>> = self
25            .iter()
26            .filter(|(_, col)| col.flags().contains(&flag))
27            .map(|(k, v)| (k.clone(), v.clone()))
28            .collect();
29        Arc::new(filtered)
30    }
31
32    fn exclude(&self, flag: ColumnFlag) -> Arc<IndexMap<String, Arc<dyn ColumnLike>>> {
33        let filtered: IndexMap<String, Arc<dyn ColumnLike>> = self
34            .iter()
35            .filter(|(_, col)| !col.flags().contains(&flag))
36            .map(|(k, v)| (k.clone(), v.clone()))
37            .collect();
38        Arc::new(filtered)
39    }
40}