use rusqlite::Result as SqlResult;
use greg::{
Point,
Scale,
Calendar
};
use greg::calendar::{
Date,
DateTime,
Time
};
use crate::Nunc;
use crate::core::{
Zone,
zone::Table
};
pub struct LookupFormatter<'n> {
pub nunc: &'n Nunc,
pub cal: Calendar<Table>
}
pub fn format_by(datetime: DateTime, scale: Scale) -> String {
let dt @ DateTime(
date @ Date {y, m: mo, d: _},
Time {h, m, s: _}
) = datetime;
match scale {
Scale::Years => format!("{y:04}"),
Scale::Months => format!("{y:04}-{mo:02}"),
Scale::Weeks |
Scale::Days => date.to_string(),
Scale::Hours |
Scale::Minutes => format!("{date} {h:02}:{m:02}"),
Scale::Seconds => dt.to_string(),
}
}
impl<'n> LookupFormatter<'n> {
pub fn new(nunc: &'n Nunc) -> SqlResult<Self> {
let cal = nunc.load_calendar()?;
Ok(Self{nunc, cal})
}
pub fn format_by(&self, scale: Scale, point: Point) -> String {
format_by(self.cal.lookup(point), scale)
}
}