From 15a203acf2a01454a5c354f86343b4693ddf1157 Mon Sep 17 00:00:00 2001 From: "Wyatt J. Miller" Date: Mon, 17 Mar 2025 07:15:36 -0400 Subject: [PATCH] moved datetime functions to utils dir --- backend/public/src/routes/comments.rs | 3 +- backend/public/src/routes/posts.rs | 66 +++------------------------ backend/public/src/utils/datetime.rs | 56 +++++++++++++++++++++++ backend/public/src/utils/mod.rs | 1 + 4 files changed, 65 insertions(+), 61 deletions(-) create mode 100644 backend/public/src/utils/datetime.rs diff --git a/backend/public/src/routes/comments.rs b/backend/public/src/routes/comments.rs index 4a71457..a8a1ab1 100644 --- a/backend/public/src/routes/comments.rs +++ b/backend/public/src/routes/comments.rs @@ -1,5 +1,4 @@ -use super::posts::{deserialize_datetime, serialize_datetime}; -use crate::{datasources::comments::CommentsDatasource, state::AppState}; +use crate::{datasources::comments::CommentsDatasource, state::AppState, utils::datetime::*}; use axum::{ extract::{Path, State}, http::StatusCode, diff --git a/backend/public/src/routes/posts.rs b/backend/public/src/routes/posts.rs index 987bf7b..70ec8d6 100644 --- a/backend/public/src/routes/posts.rs +++ b/backend/public/src/routes/posts.rs @@ -1,8 +1,8 @@ -use std::collections::HashMap; -use std::fmt; - -use crate::utils::rss; -use crate::{datasources::posts::PostsDatasource, state::AppState}; +use crate::{ + datasources::posts::PostsDatasource, + state::AppState, + utils::{datetime::*, rss}, +}; use axum::http::{HeaderMap, HeaderValue}; use axum::{ extract::{Path, State}, @@ -13,7 +13,8 @@ use axum::{ }; use chrono::Utc; use fred::types::Expiration; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; #[derive(sqlx::FromRow, Deserialize, Serialize, Debug, Clone)] pub struct Post { @@ -359,56 +360,3 @@ impl PostsRoute { } } } - -pub fn serialize_datetime( - date: &Option>, - serializer: S, -) -> Result -where - S: Serializer, -{ - serializer.serialize_str(&date.unwrap().to_rfc3339()) -} - -pub fn deserialize_datetime<'de, D>( - deserializer: D, -) -> Result>, D::Error> -where - D: Deserializer<'de>, -{ - struct DateTimeVisitor; - - impl<'de> serde::de::Visitor<'de> for DateTimeVisitor { - type Value = Option>; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("an ISO 8601 formatted date string or null") - } - - fn visit_str(self, value: &str) -> Result - where - E: serde::de::Error, - { - match chrono::DateTime::parse_from_rfc3339(value) { - Ok(dt) => Ok(Some(dt.with_timezone(&Utc))), - Err(e) => Err(E::custom(format!("Failed to parse datetime: {}", e))), - } - } - - fn visit_none(self) -> Result - where - E: serde::de::Error, - { - Ok(None) - } - - fn visit_some(self, deserializer: D) -> Result - where - D: Deserializer<'de>, - { - deserializer.deserialize_str(self) - } - } - - deserializer.deserialize_option(DateTimeVisitor) -} diff --git a/backend/public/src/utils/datetime.rs b/backend/public/src/utils/datetime.rs new file mode 100644 index 0000000..1b64bbd --- /dev/null +++ b/backend/public/src/utils/datetime.rs @@ -0,0 +1,56 @@ +use chrono::Utc; +use serde::{Deserializer, Serializer}; +use std::fmt; + +pub fn serialize_datetime( + date: &Option>, + serializer: S, +) -> Result +where + S: Serializer, +{ + serializer.serialize_str(&date.unwrap().to_rfc3339()) +} + +pub fn deserialize_datetime<'de, D>( + deserializer: D, +) -> Result>, D::Error> +where + D: Deserializer<'de>, +{ + struct DateTimeVisitor; + + impl<'de> serde::de::Visitor<'de> for DateTimeVisitor { + type Value = Option>; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("an ISO 8601 formatted date string or null") + } + + fn visit_str(self, value: &str) -> Result + where + E: serde::de::Error, + { + match chrono::DateTime::parse_from_rfc3339(value) { + Ok(dt) => Ok(Some(dt.with_timezone(&Utc))), + Err(e) => Err(E::custom(format!("Failed to parse datetime: {}", e))), + } + } + + fn visit_none(self) -> Result + where + E: serde::de::Error, + { + Ok(None) + } + + fn visit_some(self, deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_str(self) + } + } + + deserializer.deserialize_option(DateTimeVisitor) +} diff --git a/backend/public/src/utils/mod.rs b/backend/public/src/utils/mod.rs index aaa67c0..a0a3bf5 100644 --- a/backend/public/src/utils/mod.rs +++ b/backend/public/src/utils/mod.rs @@ -1 +1,2 @@ +pub mod datetime; pub mod rss;