use std::collections::BTreeMap;
use serde::Serialize;
use crate::emulator::Button;
use crate::stats::StatsReport;
#[derive(Serialize)]
pub struct Status {
pub buttons: Vec<Button>,
pub latency: BTreeMap<String, u32>,
pub stats: StatsReport,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<String>,
}
pub struct StatusPublisher {
producer: moq_lite::TrackProducer,
last_json: String,
}
impl StatusPublisher {
pub fn new(broadcast: &mut moq_lite::BroadcastProducer) -> anyhow::Result<Self> {
let track = moq_lite::Track {
name: "status".to_string(),
priority: 10,
};
let producer = broadcast.create_track(track)?;
Ok(Self {
producer,
last_json: String::new(),
})
}
pub fn publish(&mut self, status: &Status) {
let json = serde_json::to_string(status).unwrap();
if json != self.last_json {
self.last_json = json.clone();
if let Ok(mut group) = self.producer.append_group() {
let _ = group.write_frame(json.into_bytes());
let _ = group.finish();
}
}
}
}