use crate::kernel::Predicate;
use crate::model::{BalanceTreeNode, RegisterPosting};
use regex::RegexSet;
use std::error::Error;
use tackler_api::metadata::Checksum;
pub trait ReportItemSelector {
fn checksum(&self) -> Result<Checksum, Box<dyn Error>>;
}
pub trait BalanceItemSelector: Predicate<BalanceTreeNode> {}
pub trait BalanceSelector: BalanceItemSelector + ReportItemSelector {}
#[derive(Default)]
pub struct BalanceAllSelector {}
impl BalanceSelector for BalanceAllSelector {}
impl BalanceItemSelector for BalanceAllSelector {}
impl ReportItemSelector for BalanceAllSelector {
fn checksum(&self) -> Result<Checksum, Box<dyn Error>> {
todo!()
}
}
impl Predicate<BalanceTreeNode> for BalanceAllSelector {
fn eval(&self, _: &BalanceTreeNode) -> bool {
true
}
}
#[derive(Default)]
pub struct BalanceNonZeroSelector {}
impl BalanceSelector for BalanceNonZeroSelector {}
impl BalanceItemSelector for BalanceNonZeroSelector {}
impl ReportItemSelector for BalanceNonZeroSelector {
fn checksum(&self) -> Result<Checksum, Box<dyn Error>> {
todo!()
}
}
impl Predicate<BalanceTreeNode> for BalanceNonZeroSelector {
fn eval(&self, btn: &BalanceTreeNode) -> bool {
!btn.account_sum.is_zero()
}
}
pub struct BalanceNonZeroByAccountSelector {
acc_sel: BalanceByAccountSelector,
}
impl BalanceSelector for crate::kernel::report_item_selector::BalanceNonZeroByAccountSelector {}
impl BalanceItemSelector for crate::kernel::report_item_selector::BalanceNonZeroByAccountSelector {}
impl ReportItemSelector for crate::kernel::report_item_selector::BalanceNonZeroByAccountSelector {
fn checksum(&self) -> Result<Checksum, Box<dyn Error>> {
todo!()
}
}
impl Predicate<BalanceTreeNode>
for crate::kernel::report_item_selector::BalanceNonZeroByAccountSelector
{
fn eval(&self, btn: &BalanceTreeNode) -> bool {
!btn.account_sum.is_zero() && self.acc_sel.eval(btn)
}
}
impl BalanceNonZeroByAccountSelector {
pub fn from(patterns: &[&str]) -> Result<BalanceNonZeroByAccountSelector, Box<dyn Error>> {
let bfa = BalanceByAccountSelector {
regexs: RegexSet::new(patterns)?,
};
let bnza = BalanceNonZeroByAccountSelector { acc_sel: bfa };
Ok(bnza)
}
}
pub struct BalanceByAccountSelector {
regexs: RegexSet,
}
impl BalanceByAccountSelector {
pub fn from(patterns: &[&str]) -> Result<BalanceByAccountSelector, Box<dyn Error>> {
let bfa = BalanceByAccountSelector {
regexs: RegexSet::new(patterns)?,
};
Ok(bfa)
}
}
impl BalanceItemSelector for BalanceByAccountSelector {}
impl BalanceSelector for BalanceByAccountSelector {}
impl Predicate<BalanceTreeNode> for BalanceByAccountSelector {
fn eval(&self, btn: &BalanceTreeNode) -> bool {
self.regexs.is_match(&btn.acctn.account)
}
}
impl ReportItemSelector for BalanceByAccountSelector {
fn checksum(&self) -> Result<Checksum, Box<dyn Error>> {
todo!()
}
}
pub trait RegisterItemSelector<'a>: Predicate<RegisterPosting<'a>> {}
pub trait RegisterSelector<'a>: RegisterItemSelector<'a> + ReportItemSelector {}
pub struct RegisterByAccountSelector {
regexs: RegexSet,
}
impl RegisterByAccountSelector {
pub fn from(patterns: &[&str]) -> Result<RegisterByAccountSelector, Box<dyn Error>> {
let ras = RegisterByAccountSelector {
regexs: RegexSet::new(patterns)?,
};
Ok(ras)
}
}
impl<'a> RegisterSelector<'a> for RegisterByAccountSelector {}
impl<'a> RegisterItemSelector<'a> for RegisterByAccountSelector {}
impl<'a> Predicate<RegisterPosting<'a>> for RegisterByAccountSelector {
fn eval(&self, rep: &RegisterPosting) -> bool {
self.regexs.is_match(&rep.post.acctn.account)
}
}
impl ReportItemSelector for RegisterByAccountSelector {
fn checksum(&self) -> Result<Checksum, Box<dyn Error>> {
todo!()
}
}
#[derive(Default)]
pub struct RegisterAllSelector {}
impl<'a> Predicate<RegisterPosting<'a>> for RegisterAllSelector {
fn eval(&self, _: &RegisterPosting) -> bool {
true
}
}
impl<'a> RegisterItemSelector<'a> for RegisterAllSelector {}
impl<'a> RegisterSelector<'a> for RegisterAllSelector {}
impl ReportItemSelector for RegisterAllSelector {
fn checksum(&self) -> Result<Checksum, Box<dyn Error>> {
todo!()
}
}