use serde::Deserialize;
use serde_json::json;
use crate::engine::protocol::{decode, RequestRegistration, Response};
use crate::engine::PreviewKind;
#[derive(Deserialize)]
struct PreviewReq {
kind: String,
#[serde(rename = "type")]
type_id: String,
}
fn parse_kind(kind: &str) -> Option<PreviewKind> {
match kind {
"veil" => Some(PreviewKind::Veil),
"void" => Some(PreviewKind::Void),
_ => None,
}
}
pub fn registrations() -> Vec<RequestRegistration> {
vec![
RequestRegistration {
kind: "start_preview",
handle: |engine, payload, _b| {
let r: PreviewReq = decode(payload)?;
match parse_kind(&r.kind) {
Some(PreviewKind::Veil) => engine.start_veil_preview(&r.type_id),
Some(PreviewKind::Void) => engine.start_void_preview(&r.type_id),
None => {}
}
Ok(Response::empty())
},
},
RequestRegistration {
kind: "poll_preview",
handle: |engine, payload, _b| {
let r: PreviewReq = decode(payload)?;
let Some(kind) = parse_kind(&r.kind) else {
return Ok(Response::json(serde_json::Value::Null));
};
let Some((width, height, frames)) = engine.poll_preview(kind, &r.type_id) else {
return Ok(Response::json(serde_json::Value::Null));
};
let fps = crate::gpu::preview::PREVIEW_FPS;
let frame_count = frames.len();
let mut bytes = Vec::new();
for f in &frames {
bytes.extend_from_slice(f);
}
let value = json!({
"width": width,
"height": height,
"fps": fps,
"frameCount": frame_count,
});
Ok(Response::binary(value, bytes))
},
},
]
}