#![deny(missing_docs)]
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Event {
pub run_id: String,
pub id: u64,
pub ts_unix_ms: u64,
pub kind: String,
pub payload: Value,
}
impl Event {
pub fn to_json_line(&self) -> String {
serde_json::to_string(self).expect("serialize Event")
}
}
#[derive(Debug, Clone)]
pub struct Emitter {
run_id: String,
next_id: u64,
}
impl Emitter {
pub fn new(run_id: impl Into<String>) -> Self {
Self {
run_id: run_id.into(),
next_id: 1,
}
}
pub fn emit(&mut self, kind: impl Into<String>, payload: Value) -> Event {
let id = self.next_id;
self.next_id += 1;
Event {
run_id: self.run_id.clone(),
id,
ts_unix_ms: now_ms(),
kind: kind.into(),
payload,
}
}
pub fn run_id(&self) -> &str {
&self.run_id
}
pub fn count(&self) -> u64 {
self.next_id - 1
}
}
fn now_ms() -> u64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_millis() as u64)
.unwrap_or(0)
}