use crate::core::Core;
use crate::core::failed;
use crate::event::Event;
use crate::failure::FailureCode;
use crate::qbe::SortOrder;
use crate::state::TableViewState;
impl Core {
pub(crate) fn set_table_sort(
&mut self,
table: &str,
field: &str,
order: SortOrder,
) -> Vec<Event> {
let Some(db) = Core::mutable_table(self, table) else {
return failed(FailureCode::NotFound, format!("unknown table {table:?}"));
};
let Some(column) =
db.0.iter()
.find(|f| f.name.eq_ignore_ascii_case(field))
.cloned()
else {
return failed(
FailureCode::NotFound,
format!("field {field:?} is not a field of {table:?}"),
);
};
let view = db.1;
if order == SortOrder::None {
view.sort_field = None;
view.sort_order = None;
} else {
view.sort_field = Some(column.name.clone());
view.sort_order = Some(order);
}
Vec::new()
}
pub(crate) fn set_table_filter(
&mut self,
table: &str,
field: &str,
criteria: Option<&str>,
) -> Vec<Event> {
let Some(db) = Core::mutable_table(self, table) else {
return failed(FailureCode::NotFound, format!("unknown table {table:?}"));
};
let Some(column) =
db.0.iter()
.find(|f| f.name.eq_ignore_ascii_case(field))
.cloned()
else {
return failed(
FailureCode::NotFound,
format!("field {field:?} is not a field of {table:?}"),
);
};
let view = db.1;
match criteria {
Some(text) => {
if let Err(error) = crate::query_criteria::parse_predicate(text, field, &column) {
return failed(FailureCode::Port, error.to_string());
}
view.filters.insert(column.name.clone(), text.to_owned());
}
None => {
view.filters.remove(&column.name);
}
}
Vec::new()
}
pub(crate) fn clear_table_filters(&mut self, table: &str) -> Vec<Event> {
let Some(db) = Core::mutable_table(self, table) else {
return failed(FailureCode::NotFound, format!("unknown table {table:?}"));
};
db.1.filters.clear();
Vec::new()
}
fn mutable_table<'core>(
core: &'core mut Core,
table: &str,
) -> Option<(&'core [crate::schema::FieldDef], &'core mut TableViewState)> {
let db = core.state.database.as_mut()?;
let canonical = db
.tables
.iter()
.find(|candidate| candidate.name.eq_ignore_ascii_case(table))?
.name
.clone();
let fields = db
.tables
.iter()
.find(|candidate| candidate.name == canonical)
.map(|candidate| candidate.fields.as_slice())?;
let entry = db.table_views.entry(canonical).or_default();
Some((fields, entry))
}
}