today/src/eval.rs
2021-12-19 00:56:34 +01:00

61 lines
1.5 KiB
Rust

use chrono::NaiveDate;
use crate::files::arguments::{Range, RangeDate};
use crate::files::Files;
use self::command::CommandState;
pub use self::date::Dates;
use self::delta::Delta;
use self::entry::Entries;
pub use self::entry::{Entry, EntryKind, EntryMode};
pub use self::error::{Error, Result, SourceInfo};
pub use self::range::DateRange;
mod command;
mod date;
mod delta;
mod entry;
mod error;
mod range;
mod util;
impl Files {
pub fn eval(&self, mode: EntryMode, range: DateRange) -> Result<Vec<Entry>> {
let mut entries = Entries::new(mode, range);
for command in self.commands() {
for entry in CommandState::new(command, range).eval()?.entries() {
entries.add(entry);
}
}
Ok(entries.entries())
}
}
impl Range {
pub fn eval(&self, index: usize, today: NaiveDate) -> Result<DateRange> {
let mut start = match self.start {
RangeDate::Date(d) => d,
RangeDate::Today => today,
};
if let Some(delta) = &self.start_delta {
let delta: Delta = delta.into();
start = delta.apply_date(index, start)?;
}
let mut end = start;
match self.end {
Some(RangeDate::Date(d)) => end = d,
Some(RangeDate::Today) => end = today,
None => {}
}
if let Some(delta) = &self.end_delta {
let delta: Delta = delta.into();
end = delta.apply_date(index, end)?;
}
Ok(DateRange::new(start, end))
}
}