use std::fmt;
use redis::{self, FromRedisValue, RedisResult, RedisWrite, ToRedisArgs};
use serde::Serialize;
#[derive(Clone, Debug, PartialEq, PartialOrd, Serialize)]
pub struct DateTime(chrono::DateTime<chrono::Utc>);
impl DateTime {
pub fn now() -> Self {
DateTime(chrono::Utc::now())
}
pub fn seconds_since(&self, other: &DateTime) -> i64 {
self.0.signed_duration_since(other.0).num_seconds()
}
}
impl FromRedisValue for DateTime {
fn from_redis_value(v: &redis::Value) -> RedisResult<Self> {
let dt: String = redis::from_redis_value(v)?;
Ok(DateTime(
chrono::DateTime::parse_from_rfc3339(&dt)
.unwrap()
.with_timezone(&chrono::Utc),
))
}
}
impl ToRedisArgs for DateTime {
fn write_redis_args<W: ?Sized + RedisWrite>(&self, out: &mut W) {
self.0.to_rfc3339().write_redis_args(out)
}
}
impl fmt::Display for DateTime {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0.to_rfc3339())
}
}