use cratefield_core::{Clock as _, IdGen as _, ModuleContext, SystemClock, UlidIdGen};
use time::OffsetDateTime;
use time::format_description::well_known::Rfc3339;
pub(crate) fn iso(at: OffsetDateTime) -> String {
at.replace_nanosecond(0)
.unwrap_or(at)
.format(&Rfc3339)
.unwrap_or_default()
}
pub(crate) fn parse(stored: &str) -> OffsetDateTime {
OffsetDateTime::parse(stored, &Rfc3339).unwrap_or(OffsetDateTime::UNIX_EPOCH)
}
pub(crate) fn now(ctx: &ModuleContext) -> String {
match ctx.ports.clock.as_ref() {
Some(clock) => iso(clock.now()),
None => iso(SystemClock.now()),
}
}
pub(crate) fn new_id(ctx: &ModuleContext) -> String {
match ctx.ports.id_gen.as_ref() {
Some(id_gen) => id_gen.ulid(),
None => UlidIdGen.ulid(),
}
}
pub(crate) fn plus_secs(at: &str, seconds: i64) -> String {
iso(parse(at).saturating_add(time::Duration::seconds(seconds)))
}
pub(crate) fn new_token(ctx: &ModuleContext) -> String {
format!("{}{}", new_id(ctx), new_id(ctx))
}