use ciborium::Value as CborValue;
use vantage_core::Result;
use crate::rhai::traverse::traverse;
use crate::{FilterOp, sort::SortDirection, vista::Vista};
#[derive(Clone, Debug)]
pub(crate) enum Step {
Where {
col: String,
op: FilterOp,
value: CborValue,
},
Sort {
col: String,
dir: SortDirection,
},
Search(String),
Limit(usize),
Ref(String),
}
impl Step {
pub(super) fn apply(&self, mut vista: Vista, ref_cap: Option<usize>) -> Result<Vista> {
match self {
Step::Where { col, op, value } => vista.add_condition(col, *op, value.clone())?,
Step::Sort { col, dir } => vista.set_order(Some((col, *dir)))?,
Step::Search(text) => vista.set_search(Some(text))?,
Step::Limit(_) => {}
Step::Ref(rel) => return traverse(&vista, rel, ref_cap),
}
Ok(vista)
}
pub(super) fn ref_cap_after(&self, ref_cap: Option<usize>) -> Option<usize> {
match self {
Step::Limit(n) => Some(ref_cap.map_or(*n, |cap| cap.min(*n))),
Step::Ref(_) => None,
_ => ref_cap,
}
}
}