use crate::interfaces::factory::IFactory; use crate::libs::intertrait::CastFrom; use crate::ptr::InterfacePtr; pub trait AnyFactory: CastFrom {} pub struct CastableFactory where Args: 'static, ReturnInterface: 'static + ?Sized, { func: &'static dyn Fn>, } impl CastableFactory where Args: 'static, ReturnInterface: 'static + ?Sized, { pub fn new( func: &'static dyn Fn>, ) -> Self { Self { func } } } impl IFactory for CastableFactory where Args: 'static, ReturnInterface: 'static + ?Sized, { } impl Fn for CastableFactory where Args: 'static, ReturnInterface: 'static + ?Sized, { extern "rust-call" fn call(&self, args: Args) -> Self::Output { self.func.call(args) } } impl FnMut for CastableFactory where Args: 'static, ReturnInterface: 'static + ?Sized, { extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output { self.call(args) } } impl FnOnce for CastableFactory where Args: 'static, ReturnInterface: 'static + ?Sized, { type Output = InterfacePtr; extern "rust-call" fn call_once(self, args: Args) -> Self::Output { self.call(args) } } impl AnyFactory for CastableFactory where Args: 'static, ReturnInterface: 'static + ?Sized, { }