about summary refs log tree commit diff
diff options
context:
space:
mode:
authorgennyble <gen@nyble.dev>2026-09-20 19:43:42 -0500
committergennyble <gen@nyble.dev>2026-09-20 19:43:42 -0500
commit178ca3c066a1ef920b112da741625099b6dc07da (patch)
tree4fe1e2822975c1a8a2c42967cb0d061a1408fb46
parentdcadd27bc12e96585cdf96e6c6de087af63c0c6d (diff)
move timeparse to it's own crate
-rw-r--r--Cargo.lock8
-rw-r--r--Cargo.toml3
-rwxr-xr-xawake/Cargo.toml8
-rwxr-xr-xawake/src/main.rs13
-rwxr-xr-xawake/src/util.rs14
-rw-r--r--timeparse/Cargo.toml11
-rw-r--r--timeparse/src/format.rs25
-rwxr-xr-xtimeparse/src/lib.rs (renamed from awake/src/timeparse.rs)43
8 files changed, 77 insertions, 48 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 23ee9c9..1813ea6 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -49,6 +49,7 @@ dependencies = [
  "sha2",
  "snafu",
  "time",
+ "timeparse",
  "tokio",
  "tokio-util",
  "tracing",
@@ -1492,6 +1493,13 @@ dependencies = [
 ]
 
 [[package]]
+name = "timeparse"
+version = "1.0.0"
+dependencies = [
+ "time",
+]
+
+[[package]]
 name = "tinystr"
 version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index ecbe589..73829c4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [workspace]
 resolver = "3"
-members = ["awake", "markup", "pushwhatever", "shovel", "wikarden"]
+members = ["awake", "markup", "pushwhatever", "shovel", "timeparse", "wikarden"]
 
 [workspace.dependencies]
 bempline = { git = "https://github.com/gennyble/bempline" }
@@ -13,6 +13,7 @@ time = { version = "0.3.55", features = ["local-offset"] }
 # Local Crates
 markup = { path = "markup" }
 wikarden = { path = "wikarden" }
+timeparse = { path = "timeparse" }
 
 [workspace.dependencies.scurvy]
 git = "https://git.dreamy.place/crates/scurvy/"
diff --git a/awake/Cargo.toml b/awake/Cargo.toml
index f48f315..748e0b3 100755
--- a/awake/Cargo.toml
+++ b/awake/Cargo.toml
@@ -18,12 +18,8 @@ confindent = { git = "https://github.com/gennyble/confindent", branch = "v3.0-wr
 cutie = { git = "https://git.dreamy.place/crates/cutie" }
 tracing = "0.1.40"
 tracing-subscriber = { version = "0.3.18", features = ["env-filter"] }
-time = { workspace = true, features = [
-	"macros",
-	"parsing",
-	"formatting",
-	"local-offset",
-] }
+timeparse.workspace = true
+time.workspace = true
 sha2 = "0.10.8"
 url = "2.5.0"
 rusqlite = { version = "0.40.2", features = ["bundled", "time", "fallible_uint"] }
diff --git a/awake/src/main.rs b/awake/src/main.rs
index 7a97468..24e9692 100755
--- a/awake/src/main.rs
+++ b/awake/src/main.rs
@@ -8,7 +8,6 @@ mod me;
 mod query;
 mod settings;
 mod templated;
-mod timeparse;
 mod util;
 mod wiki;
 
@@ -41,7 +40,7 @@ use settings::Settings;
 use templated::Frontmatter;
 use tokio_util::io::ReaderStream;
 use tracing_subscriber::{prelude::*, EnvFilter};
-use util::{Referer, SessionId};
+use util::{Referer, SessionHash};
 use wikarden::Wikarden;
 
 use crate::{
@@ -150,7 +149,7 @@ async fn index_handler(
 	state: State<AwakeState>,
 	fse: Extension<Filesystem>,
 	se: Extension<Settings>,
-	sid: SessionId,
+	sid: SessionHash,
 	rfr: Option<Referer>,
 ) -> Result<Response, RuntimeError> {
 	handler(state, fse, se, sid, rfr, Path(String::from("/"))).await
@@ -161,7 +160,7 @@ async fn handler(
 	State(state): State<AwakeState>,
 	Extension(fs): Extension<Filesystem>,
 	Extension(settings): Extension<Settings>,
-	sid: SessionId,
+	sid: SessionHash,
 	rfr: Option<Referer>,
 	Path(path): Path<String>,
 ) -> Result<Response, RuntimeError> {
@@ -276,7 +275,7 @@ async fn send_template(
 	webpath: Webpath,
 	state: AwakeState,
 	settings: Settings,
-	sid: SessionId,
+	sid: SessionHash,
 ) -> Result<Response, RuntimeError> {
 	tracing::trace!("[{sid}] sending template");
 	let template_stem = templated.frontmatter.get("template").expect("no template");
@@ -395,8 +394,8 @@ async fn send_template(
 					break 'published;
 				}
 				Some(Ok(datetime)) => {
-					let published_human = timeparse::format_long(&datetime);
-					let published_machine = timeparse::iso8601(&datetime);
+					let published_human = timeparse::format::human_long(&datetime);
+					let published_machine = timeparse::format::iso8601(&datetime);
 
 					variables!(published_pattern, published_human, published_machine);
 					template.set_pattern(published_pattern);
diff --git a/awake/src/util.rs b/awake/src/util.rs
index 90cbadc..c7ea61d 100755
--- a/awake/src/util.rs
+++ b/awake/src/util.rs
@@ -7,7 +7,6 @@ use axum::{
 	RequestPartsExt,
 };
 use sha2::{Digest, Sha256};
-use time::{format_description::FormatItem, macros::format_description, OffsetDateTime};
 
 #[derive(Debug, Clone)]
 pub struct RemoteIp(String);
@@ -41,12 +40,10 @@ impl Deref for RemoteIp {
 	}
 }
 
-const FMT: &[FormatItem<'_>] = format_description!("[year]-[month]-[day]");
-
 #[derive(Debug, Copy, Clone)]
-pub struct SessionId([u8; 4]);
+pub struct SessionHash([u8; 4]);
 
-impl<S> FromRequestParts<S> for SessionId
+impl<S> FromRequestParts<S> for SessionHash
 where
 	S: Send + Sync,
 {
@@ -65,9 +62,8 @@ where
 			.and_then(|ua| ua.to_str().ok())
 			.unwrap_or("unknown");
 
-		let date = OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc());
-
-		let string = format!("{remote} - {agent} - {}", date.format(FMT).unwrap());
+		let date = timeparse::whichever_now();
+		let string = timeparse::format::iso_date(&date.date());
 
 		let mut hasher = Sha256::new();
 		hasher.update(string.as_bytes());
@@ -78,7 +74,7 @@ where
 	}
 }
 
-impl fmt::Display for SessionId {
+impl fmt::Display for SessionHash {
 	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
 		for byte in self.0.as_slice() {
 			write!(f, "{byte:02X}")?;
diff --git a/timeparse/Cargo.toml b/timeparse/Cargo.toml
new file mode 100644
index 0000000..d011d9f
--- /dev/null
+++ b/timeparse/Cargo.toml
@@ -0,0 +1,11 @@
+[package]
+name = "timeparse"
+version = "1.0.0"
+edition = "2024"
+
+[dependencies]
+time = { workspace = true, features = [
+	"macros",
+	"parsing",
+	"local-offset",
+] }
diff --git a/timeparse/src/format.rs b/timeparse/src/format.rs
new file mode 100644
index 0000000..50fa117
--- /dev/null
+++ b/timeparse/src/format.rs
@@ -0,0 +1,25 @@
+use time::{Date, OffsetDateTime, format_description::well_known};
+
+use crate::MONTHS;
+
+pub fn human_long(datetime: &OffsetDateTime) -> String {
+	let year = datetime.year();
+	let month = MONTHS[datetime.month() as usize - 1][1];
+	let day = datetime.day();
+	let weekday = datetime.weekday();
+
+	format!("{weekday} {day}, {month} {year}")
+}
+
+pub fn iso8601(datetime: &OffsetDateTime) -> String {
+	datetime
+		.format(&well_known::Iso8601::DATE_TIME_OFFSET)
+		.unwrap()
+}
+
+pub fn iso_date(date: &Date) -> String {
+	let year = date.year();
+	let month = date.month();
+	let day = date.day();
+	format!("{year}-{month:02}-{day:02}")
+}
diff --git a/awake/src/timeparse.rs b/timeparse/src/lib.rs
index 05e0226..3c8da8e 100755
--- a/awake/src/timeparse.rs
+++ b/timeparse/src/lib.rs
@@ -1,30 +1,34 @@
 use time::{
+	Date, OffsetDateTime, PrimitiveDateTime, Time, UtcOffset, Weekday,
 	error::{Parse, TryFromParsed},
-	format_description::{well_known, FormatItem},
+	format_description::FormatItem,
 	macros::{format_description, offset, time},
-	Date, OffsetDateTime, PrimitiveDateTime, Time, UtcOffset, Weekday,
 };
 
+pub mod format;
+
 #[allow(unused)]
-const FMT: &[FormatItem<'_>] = format_description!("[year]-[month]-[day] [hour]:[minute]");
+pub(crate) const FMT: &[FormatItem<'_>] =
+	format_description!("[year]-[month]-[day] [hour]:[minute]");
 
-const DATE: &[FormatItem<'_>] = format_description!("[year]-[month]-[day]");
-const TIME_24HOUR: &[FormatItem<'_>] = format_description!("[hour padding:zero]:[minute]");
-const TIME_12HOUR: &[FormatItem<'_>] =
+pub(crate) const DATE: &[FormatItem<'_>] = format_description!("[year]-[month]-[day]");
+pub(crate) const TIME_24HOUR: &[FormatItem<'_>] =
+	format_description!("[hour padding:zero]:[minute]");
+pub(crate) const TIME_12HOUR: &[FormatItem<'_>] =
 	format_description!("[hour padding:none]:[minute][period case:lower case_sensitive:false]");
 
 #[allow(unused)]
-const OFFSET: &[FormatItem<'_>] =
+pub(crate) const OFFSET: &[FormatItem<'_>] =
 	format_description!("[offset_hour sign:mandatory]:[offset_minute]");
 
-const CST: UtcOffset = offset!(-06:00);
-const CDT: UtcOffset = offset!(-05:00);
+pub(crate) const CST: UtcOffset = offset!(-06:00);
+pub(crate) const CDT: UtcOffset = offset!(-05:00);
 
 // Ripped from infica with the month of Sol removed. I just want the 3 letter months
 /// Capitalized months (long, short) and lowercase months (long, short).
 // it seems useful to have the lowercase here so we don't have to always call
 // to_lowercase
-const MONTHS: [[&str; 4]; 12] = [
+pub(crate) const MONTHS: [[&str; 4]; 12] = [
 	["January", "Jan", "january", "jan"],
 	["February", "Feb", "february", "feb"],
 	["March", "Mar", "march", "mar"],
@@ -138,29 +142,18 @@ pub fn parse(raw: &str) -> Result<OffsetDateTime, time::error::Parse> {
 	Ok(OffsetDateTime::new_in_offset(date, time, offset))
 }
 
-pub fn format_long(datetime: &OffsetDateTime) -> String {
-	let year = datetime.year();
-	let month = MONTHS[datetime.month() as usize - 1][1];
-	let day = datetime.day();
-	let weekday = datetime.weekday();
-
-	format!("{weekday} {day}, {month} {year}")
-}
-
-pub fn iso8601(datetime: &OffsetDateTime) -> String {
-	datetime
-		.format(&well_known::Iso8601::DATE_TIME_OFFSET)
-		.unwrap()
+pub fn whichever_now() -> OffsetDateTime {
+	OffsetDateTime::now_local().unwrap_or_else(|_| OffsetDateTime::now_utc())
 }
 
 #[cfg(test)]
 mod test {
 	use time::{
-		macros::{datetime, offset},
 		OffsetDateTime, PrimitiveDateTime,
+		macros::{datetime, offset},
 	};
 
-	use crate::timeparse::{parse_offset, us_dst_central_offset, CDT, CST, FMT};
+	use crate::{CDT, CST, FMT, parse_offset, us_dst_central_offset};
 
 	#[test]
 	fn calculates_cst_cdt_correctly() {