use std::sync::{Arc, OnceLock};
use crate::traits::media_interaction::PreviewMediaRequest;
pub type WindowsMediaPreviewOpen =
Arc<dyn Fn(PreviewMediaRequest) -> Result<(), String> + Send + Sync>;
pub type WindowsMediaPreviewCancel = Arc<dyn Fn(u64) -> Result<(), String> + Send + Sync>;
static HOST: OnceLock<(WindowsMediaPreviewOpen, WindowsMediaPreviewCancel)> = OnceLock::new();
pub fn register_windows_media_preview_host(
open: WindowsMediaPreviewOpen,
cancel: WindowsMediaPreviewCancel,
) {
if HOST.set((open, cancel)).is_err() {
log::warn!("a Windows media preview host is already registered; ignoring");
}
}
pub(crate) fn open_preview(request: PreviewMediaRequest) -> Result<(), String> {
let (open, _) = HOST
.get()
.ok_or_else(|| "no media preview host is registered on Windows".to_string())?;
open(request)
}
pub(crate) fn cancel_preview(callback_id: u64) -> Result<(), String> {
let (_, cancel) = HOST
.get()
.ok_or_else(|| "no media preview host is registered on Windows".to_string())?;
cancel(callback_id)
}