use crate::reactive_command::ICommand;
use ferroui_system::{IDisposable, IObservable};
use std::any::{Any, TypeId};
use std::rc::Rc;
pub type CommandParameter = Option<Rc<dyn Any>>;
pub type CommandEventSubscription = Rc<dyn Fn(Rc<dyn Fn()>) -> Rc<dyn IDisposable>>;
pub trait ICreatesCommandBinding {
fn get_affinity_for_object(&self, target_type: TypeId, has_event_target: bool) -> i32;
fn bind_command_to_object(
&self,
command: Option<Rc<dyn ICommand>>,
target: Option<Rc<dyn Any>>,
command_parameter: Rc<dyn IObservable<CommandParameter>>,
) -> Option<Rc<dyn IDisposable>>;
fn bind_command_to_object_event(
&self,
command: Option<Rc<dyn ICommand>>,
target: Option<Rc<dyn Any>>,
command_parameter: Rc<dyn IObservable<CommandParameter>>,
event_name: &str,
) -> Option<Rc<dyn IDisposable>>;
fn bind_command_to_object_with_handlers(
&self,
command: Option<Rc<dyn ICommand>>,
target: Option<Rc<dyn Any>>,
command_parameter: Rc<dyn IObservable<CommandParameter>>,
subscription: CommandEventSubscription,
) -> Option<Rc<dyn IDisposable>>;
}