use std::fmt::Debug;
use crate::bridge::map_observer::{MapLoadError, MapObserverCameraChangeMode};
macro_rules! callback {
($callback_name:ident, $callback_f:path) => {
callback!($callback_name, $callback_f,);
};
($callback_name:ident, $callback_f:path, $($bound:path),*) => {
pub struct $callback_name(pub(crate) Box<dyn $callback_f + 'static $(+ $bound)*>);
impl $callback_name {
pub fn new<F: $callback_f + 'static $(+ $bound)*>(callback: F) -> Self {
Self(Box::new(callback))
}
}
impl Debug for $callback_name {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Callback: {}", stringify!($callback_name))
}
}
};
}
pub(crate) use callback;
callback!(VoidCallback, Fn());
pub fn void_callback(callback: &VoidCallback) {
(callback.0)();
}
callback!(FinishRenderingFrameCallback, Fn(bool, bool));
pub fn finish_rendering_frame_callback(
callback: &FinishRenderingFrameCallback,
needs_repaint: bool,
placement_changed: bool,
) {
(callback.0)(needs_repaint, placement_changed);
}
callback!(FailingLoadingMapCallback, Fn(MapLoadError, &str));
pub fn failing_loading_map_callback(
callback: &FailingLoadingMapCallback,
error: MapLoadError,
what: &str,
) {
(callback.0)(error, what);
}
callback!(CameraDidChangeCallback, Fn(MapObserverCameraChangeMode));
pub fn camera_did_change_callback(
callback: &CameraDidChangeCallback,
mode: MapObserverCameraChangeMode,
) {
(callback.0)(mode);
}