use crate::civil::Naive;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Desig {
Year,
Quarter,
Month,
Week,
Day,
Weekday,
Hour,
Minute,
Second,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Endpoint {
Value(i64),
Star,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Atom {
All,
Single(i64),
Range {
start: Endpoint,
end: Endpoint,
wrap: bool,
},
Stride {
start: i64,
end: Endpoint,
interval: i64,
duration: i64,
},
}
#[derive(Clone, Debug)]
pub struct Selector {
pub desig: Desig,
pub atoms: Vec<Atom>,
pub exclude: bool,
pub ordinal: Option<(i64, i64)>,
pub pos: usize,
}
#[derive(Clone, Copy, Debug)]
pub struct TimeInterval {
pub start: i64,
pub end: i64,
pub wrap: bool,
}
#[derive(Clone, Debug)]
pub struct TimeSel {
pub intervals: Vec<TimeInterval>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CadUnit {
Year,
Month,
Week,
Day,
Hour,
Minute,
}
impl CadUnit {
pub fn is_month_or_year(self) -> bool {
matches!(self, CadUnit::Year | CadUnit::Month)
}
pub fn is_calendar(self) -> bool {
matches!(
self,
CadUnit::Year | CadUnit::Month | CadUnit::Week | CadUnit::Day
)
}
}
#[derive(Clone, Copy, Debug)]
pub struct Cadence {
pub anchor: Naive,
pub period_n: i64,
pub period_unit: CadUnit,
pub duration_n: i64,
pub duration_unit: CadUnit,
}
#[derive(Clone, Copy, Debug)]
pub struct Bounds {
pub start: Option<i64>,
pub end: Option<i64>,
}
#[derive(Clone, Debug, Default)]
pub struct Expr {
pub selectors: Vec<Selector>,
pub time: Option<TimeSel>,
pub cadence: Option<Cadence>,
pub bounds: Option<Bounds>,
pub has_week: bool,
}