use crate::time::CronDateTime;
use crate::{Cron, CronError, Direction};
#[derive(Debug, Clone, PartialEq, PartialOrd, Hash)]
pub struct CronIterator<T>
where
T: CronDateTime,
{
cron: Cron,
current_time: T,
is_first: bool,
inclusive: bool,
direction: Direction,
}
impl<T> CronIterator<T>
where
T: CronDateTime,
{
pub fn new(cron: Cron, start_time: T, inclusive: bool, direction: Direction) -> Self {
CronIterator {
cron,
current_time: start_time,
is_first: true,
inclusive,
direction,
}
}
}
impl<T> Iterator for CronIterator<T>
where
T: CronDateTime,
{
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
let inclusive_search = if self.is_first {
self.is_first = false;
self.inclusive
} else {
false };
let result =
self.cron
.find_occurrence(&self.current_time, inclusive_search, self.direction);
match result {
Ok(found_time) => {
self.current_time = found_time.clone();
Some(found_time)
}
Err(CronError::TimeSearchLimitExceeded) => None,
Err(e) => {
eprintln!("CronIterator encountered an error: {e:?}");
None
}
}
}
}