pub mod ar;
pub mod bg;
pub mod ca;
pub mod de;
pub mod el;
pub mod en;
pub mod es;
pub mod fr;
pub mod ga;
pub mod hi;
pub mod hu;
pub mod ja;
pub mod ka;
pub mod ko;
pub mod mn;
pub mod nb;
pub mod nl;
pub mod pl;
pub mod pt;
pub mod ro;
pub mod ru;
pub mod sv;
pub mod tr;
pub mod uk;
pub mod zh;
use crate::types::DimensionValue;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize)]
pub enum Grain {
NoGrain,
Second,
Minute,
Hour,
Day,
Week,
Month,
Quarter,
Year,
}
impl Grain {
pub fn as_str(&self) -> &'static str {
match self {
Grain::NoGrain => "no_grain",
Grain::Second => "second",
Grain::Minute => "minute",
Grain::Hour => "hour",
Grain::Day => "day",
Grain::Week => "week",
Grain::Month => "month",
Grain::Quarter => "quarter",
Grain::Year => "year",
}
}
#[allow(clippy::should_implement_trait)]
pub fn from_str(s: &str) -> Grain {
match s {
"no_grain" => Grain::NoGrain,
"second" => Grain::Second,
"minute" => Grain::Minute,
"hour" => Grain::Hour,
"day" => Grain::Day,
"week" => Grain::Week,
"month" => Grain::Month,
"quarter" => Grain::Quarter,
"year" => Grain::Year,
_ => Grain::Second,
}
}
fn order(&self) -> u8 {
match self {
Grain::NoGrain => 0,
Grain::Second => 1,
Grain::Minute => 2,
Grain::Hour => 3,
Grain::Day => 4,
Grain::Week => 5,
Grain::Month => 6,
Grain::Quarter => 7,
Grain::Year => 8,
}
}
pub fn lower(&self) -> Grain {
match self {
Grain::Year => Grain::Month,
Grain::Quarter => Grain::Month,
Grain::Month => Grain::Day,
Grain::Week => Grain::Day,
Grain::Day => Grain::Hour,
Grain::Hour => Grain::Minute,
Grain::Minute => Grain::Second,
Grain::Second => Grain::Second,
Grain::NoGrain => Grain::Second,
}
}
pub fn in_seconds(&self, n: i64) -> Option<i64> {
match self {
Grain::NoGrain => Some(n),
Grain::Second => Some(n),
Grain::Minute => n.checked_mul(60),
Grain::Hour => n.checked_mul(3600),
Grain::Day => n.checked_mul(86400),
Grain::Week => n.checked_mul(604800),
Grain::Month => n.checked_mul(2592000), Grain::Quarter => n.checked_mul(7776000), Grain::Year => n.checked_mul(31536000), }
}
pub fn one_in_seconds_f64(&self) -> f64 {
match self {
Grain::NoGrain => 1.0,
Grain::Second => 1.0,
Grain::Minute => 60.0,
Grain::Hour => 3600.0,
Grain::Day => 86400.0,
Grain::Week => 604800.0,
Grain::Month => 2592000.0,
Grain::Quarter => 7776000.0,
Grain::Year => 31536000.0,
}
}
}
impl PartialOrd for Grain {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
impl Ord for Grain {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.order().cmp(&other.order())
}
}
pub fn resolve(grain: &Grain) -> DimensionValue {
DimensionValue::TimeGrain(*grain)
}