misskey-id 0.1.0

Parse and generate misskey's id
Documentation
//! ULID (Universally Unique Lexicographically Sortable Identifier) utilities
//! 
//! Provides functions to generate and parse ULIDs.

use std::time::{Duration, SystemTime, UNIX_EPOCH};
use ulid::{DecodeError, Generator, Ulid};

use chrono::{DateTime, Local};

pub fn parse(id: &str) -> Result<SystemTime, DecodeError> {
    let ulid = Ulid::from_string(id)?;
    let timestamp = ulid.timestamp_ms();
    Ok(UNIX_EPOCH + Duration::from_millis(timestamp))
}

pub fn formatted_time(id: &str) -> String {
    let systime = parse(id).unwrap();
    let datetime: DateTime<Local> = systime.into();
    datetime.to_rfc3339()
}

pub fn gen_ulid(time: u64) -> String {
    let mut gen = Generator::new();
    let now = SystemTime::UNIX_EPOCH + Duration::from_millis(time);
    let ulid = gen.generate_from_datetime(now).unwrap().to_string();
    ulid
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_gen() {
        let generated = gen_ulid(1741525010000);
        println!("{}", generated);
        assert_eq!(generated.len(), 26);
    }

    #[test]
    fn test_parse() {
        let generated = gen_ulid(1741535238126);
        let parsed = parse(&generated).unwrap();
        assert_eq!(parsed, UNIX_EPOCH + Duration::from_millis(1741535238126));
    }
}