use serde::{Deserialize, Serialize};
use chrono::{DateTime, Utc};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArtificialClockConfig {
pub start_at: DateTime<Utc>,
pub mode: ArtificialMode,
}
fn truncate_to_millis(time: DateTime<Utc>) -> DateTime<Utc> {
DateTime::from_timestamp_millis(time.timestamp_millis()).expect("valid timestamp")
}
impl ArtificialClockConfig {
pub fn manual() -> Self {
Self {
start_at: truncate_to_millis(Utc::now()),
mode: ArtificialMode::Manual,
}
}
pub fn manual_at(start_at: DateTime<Utc>) -> Self {
Self {
start_at: truncate_to_millis(start_at),
mode: ArtificialMode::Manual,
}
}
pub fn auto(time_scale: f64) -> Self {
Self {
start_at: truncate_to_millis(Utc::now()),
mode: ArtificialMode::AutoAdvance { time_scale },
}
}
pub fn auto_at(start_at: DateTime<Utc>, time_scale: f64) -> Self {
Self {
start_at: truncate_to_millis(start_at),
mode: ArtificialMode::AutoAdvance { time_scale },
}
}
}
impl Default for ArtificialClockConfig {
fn default() -> Self {
Self::manual()
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ArtificialMode {
AutoAdvance {
time_scale: f64,
},
Manual,
}