use std::collections::BTreeMap;
use serde::Serialize;
use crate::emulator::Button;
use crate::stats::StatsReport;
#[derive(Serialize, Clone)]
pub struct LatencyEntry {
pub label: String,
pub ms: u32,
}
#[derive(Serialize)]
pub struct Status {
pub buttons: Vec<Button>,
pub latency: BTreeMap<String, Vec<LatencyEntry>>,
pub stats: StatsReport,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<String>,
}
pub struct StatusPublisher {
producer: moq_json::snapshot::Producer<Status>,
}
impl StatusPublisher {
pub fn new(broadcast: &mut moq_net::broadcast::Producer) -> anyhow::Result<Self> {
let producer = broadcast.create_track("status", None)?;
Ok(Self {
producer: moq_json::snapshot::Producer::new(producer, moq_json::snapshot::ProducerConfig::default()),
})
}
pub fn publish(&mut self, status: &Status) {
if let Err(err) = self.producer.update(status) {
tracing::warn!(%err, "failed to publish status");
}
}
}