use std::any::Any;
use std::rc::Rc;
use crate::ast::{
IXamlAstClrPropertyExtension, IXamlAstNode, IXamlPropertySetter, IXamlWrappedMethod,
};
#[macro_export]
macro_rules! xaml_query_interface {
($this:expr, $slot:expr, $($iface:ty),+ $(,)?) => {{
let this = $this;
let slot: &mut dyn ::std::any::Any = $slot;
$(
if let Some(typed) = slot.downcast_mut::<Option<::std::rc::Rc<$iface>>>() {
let handle: ::std::rc::Rc<$iface> = this;
*typed = Some(handle);
return true;
}
)+
let _ = this;
false
}};
}
pub fn query_node_interface<T: ?Sized + 'static>(node: &Rc<dyn IXamlAstNode>) -> Option<Rc<T>> {
let mut slot: Option<Rc<T>> = None;
let slot_any: &mut dyn Any = &mut slot;
if node.clone().query_interface(slot_any) {
slot
} else {
None
}
}
pub fn query_property_setter_interface<T: ?Sized + 'static>(
setter: &Rc<dyn IXamlPropertySetter>,
) -> Option<Rc<T>> {
let mut slot: Option<Rc<T>> = None;
let slot_any: &mut dyn Any = &mut slot;
if setter.clone().query_interface(slot_any) {
slot
} else {
None
}
}
pub fn query_wrapped_method_interface<T: ?Sized + 'static>(
method: &Rc<dyn IXamlWrappedMethod>,
) -> Option<Rc<T>> {
let mut slot: Option<Rc<T>> = None;
let slot_any: &mut dyn Any = &mut slot;
if method.clone().query_interface(slot_any) {
slot
} else {
None
}
}
pub fn query_clr_property_extension_interface<T: ?Sized + 'static>(
extension: &Rc<dyn IXamlAstClrPropertyExtension>,
) -> Option<Rc<T>> {
let mut slot: Option<Rc<T>> = None;
let slot_any: &mut dyn Any = &mut slot;
if extension.clone().query_interface(slot_any) {
slot
} else {
None
}
}