use super::Flags;
use crate::task::Task;
pub(crate) fn matches(task: &Task, updated: i64, flags: &Flags) -> bool {
has_tags(task, flags)
&& in_window(task.created, updated, flags)
&& has_text(task, flags)
&& has_claimant(task, flags)
}
fn has_claimant(task: &Task, flags: &Flags) -> bool {
match &flags.claimant {
None => true,
Some(want) => task.claimant.as_deref() == Some(want.as_str()),
}
}
fn has_tags(task: &Task, flags: &Flags) -> bool {
flags.tags.iter().all(|want| task.tags.contains(want))
}
fn in_window(created: i64, updated: i64, flags: &Flags) -> bool {
let hit = |t: i64| flags.since.is_none_or(|s| t >= s) && flags.until.is_none_or(|u| t <= u);
hit(created) || hit(updated)
}
fn has_text(task: &Task, flags: &Flags) -> bool {
match flags.target.as_deref() {
None => true,
Some(needle) => {
let needle = needle.to_lowercase();
task.title.to_lowercase().contains(&needle) || task.body.to_lowercase().contains(&needle)
}
}
}
#[cfg(test)]
#[path = "filter_tests.rs"]
mod tests;