use indexmap::IndexMap;
use vantage_types::{Entity, Record};
use crate::{
column::flags::ColumnFlag,
table::Table,
traits::{column_like::ColumnLike, table_source::TableSource},
};
impl<T: TableSource, E: Entity<T::Value>> Table<T, E> {
pub fn row_fields(&self) -> Vec<String> {
self.columns()
.iter()
.filter(|(_, column)| !column.flags().contains(&ColumnFlag::RequestParam))
.map(|(name, _)| name.clone())
.collect()
}
}
pub fn retain_matching<V, W: ?Sized>(
rows: &mut IndexMap<String, Record<V>>,
filters: &[(&str, &W)],
row_fields: &[String],
eq: impl Fn(&V, &W) -> bool,
) {
rows.retain(|_, row| {
filters.iter().all(|(field, wanted)| match row.get(*field) {
Some(value) => eq(value, wanted),
None => !row_fields.iter().any(|f| f == field),
})
});
}