44 lines
1.3 KiB
Rust
44 lines
1.3 KiB
Rust
use nostr::prelude::*;
|
|
|
|
/// Format a timestamp as a short relative time (e.g. "3h ago").
|
|
pub fn relative_time(timestamp: Timestamp) -> String {
|
|
let now = Timestamp::now().as_secs();
|
|
let secs = now.saturating_sub(timestamp.as_secs());
|
|
|
|
if secs < 60 {
|
|
"just now".to_string()
|
|
} else if secs < 3600 {
|
|
format!("{}m ago", secs / 60)
|
|
} else if secs < 86_400 {
|
|
format!("{}h ago", secs / 3600)
|
|
} else if secs < 30 * 86_400 {
|
|
format!("{}d ago", secs / 86_400)
|
|
} else if secs < 365 * 86_400 {
|
|
format!("{}mo ago", secs / (30 * 86_400))
|
|
} else {
|
|
format!("{}y ago", secs / (365 * 86_400))
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn formats_relative_time() {
|
|
let now = Timestamp::now();
|
|
|
|
assert_eq!(relative_time(now), "just now");
|
|
assert_eq!(relative_time(now - 300), "5m ago");
|
|
assert_eq!(relative_time(now - 7_200), "2h ago");
|
|
assert_eq!(relative_time(now - 3 * 86_400), "3d ago");
|
|
assert_eq!(relative_time(now - 60 * 86_400), "2mo ago");
|
|
assert_eq!(relative_time(now - 800 * 86_400), "2y ago");
|
|
}
|
|
|
|
#[test]
|
|
fn clamps_future_timestamps() {
|
|
assert_eq!(relative_time(Timestamp::now() + 600), "just now");
|
|
}
|
|
}
|