diff options
| author | gennyble <gen@nyble.dev> | 2026-09-20 19:43:42 -0500 |
|---|---|---|
| committer | gennyble <gen@nyble.dev> | 2026-09-20 19:43:42 -0500 |
| commit | 178ca3c066a1ef920b112da741625099b6dc07da (patch) | |
| tree | 4fe1e2822975c1a8a2c42967cb0d061a1408fb46 | |
| parent | dcadd27bc12e96585cdf96e6c6de087af63c0c6d (diff) | |
move timeparse to it's own crate
| -rw-r--r-- | Cargo.lock | 8 | ||||
| -rw-r--r-- | Cargo.toml | 3 | ||||
| -rwxr-xr-x | awake/Cargo.toml | 8 | ||||
| -rwxr-xr-x | awake/src/main.rs | 13 | ||||
| -rwxr-xr-x | awake/src/util.rs | 14 | ||||
| -rw-r--r-- | timeparse/Cargo.toml | 11 | ||||
| -rw-r--r-- | timeparse/src/format.rs | 25 | ||||
| -rwxr-xr-x | timeparse/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() { |
