swarm-engine-core 0.1.6

Core types and orchestration for SwarmEngine
Documentation
//! Time utilities - UNIX epoch ベースの時刻関数

use std::time::{SystemTime, UNIX_EPOCH};

/// UNIX epoch からのミリ秒
///
/// 用途: `created_at`, `timestamp_ms` 等の永続化フィールド
#[inline]
pub fn epoch_millis() -> u64 {
    SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .map(|d| d.as_millis() as u64)
        .unwrap_or(0)
}

/// ID 生成用タイムスタンプ
///
/// `counter` と組み合わせて一意性を確保。
/// - epoch_millis: ソート可能性(ordering)
/// - counter: 同一 ms 内の順序保証 + NTP 巻き戻り耐性
///
/// # Note
///
/// NTP 同期で時刻が戻る可能性があるため、
/// ID の一意性・順序性は `counter` に依存する。
#[inline]
pub fn epoch_millis_for_ordering() -> u64 {
    epoch_millis()
}

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

    #[test]
    fn test_epoch_millis_returns_nonzero() {
        let ts = epoch_millis();
        assert!(ts > 0);
    }

    #[test]
    fn test_epoch_millis_for_ordering_same_as_epoch_millis() {
        let ts1 = epoch_millis();
        let ts2 = epoch_millis_for_ordering();
        // 同じ実装なので、ほぼ同じ値(数ms以内の差)
        assert!((ts1 as i64 - ts2 as i64).abs() < 100);
    }

    #[test]
    fn test_epoch_millis_monotonic_in_short_term() {
        let ts1 = epoch_millis();
        let ts2 = epoch_millis();
        // 短期間では単調増加(または同値)
        assert!(ts2 >= ts1);
    }
}