diff --git a/nested/src/core/port.rs b/nested/src/core/port.rs index 5ee9220..ebfe35f 100644 --- a/nested/src/core/port.rs +++ b/nested/src/core/port.rs @@ -158,3 +158,72 @@ where V::Msg: Clone { } */ +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + +#[derive(Debug, Clone)] +pub struct AnyViewPort { + view: Arc<dyn Any + Send + Sync + 'static>, + observers: Arc<dyn Any + Send + Sync + 'static> +} + +impl AnyViewPort { + pub fn downcast<V: View + ?Sized + 'static>(self) -> Result<ViewPort<V>, AnyViewPort> { + match ( + self.view.clone().downcast::<RwLock<Option<Arc<V>>>>(), + self.observers.clone().downcast::<RwLock<ObserverBroadcast<V>>>() + ) { + (Ok(view), Ok(observers)) => Ok(ViewPort{view, observers}), + _ => Err(self) + } + } +} + +impl<V: View + ?Sized + 'static> From<ViewPort<V>> for AnyViewPort { + fn from(port: ViewPort<V>) -> Self { + AnyViewPort { + view: port.view as Arc<dyn Any + Send + Sync + 'static>, + observers: port.observers as Arc<dyn Any + Send + Sync + 'static> + } + } +} + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> + +#[derive(Debug, Clone)] +pub struct AnyOuterViewPort(AnyViewPort); + +#[derive(Debug, Clone)] +pub struct AnyInnerViewPort(AnyViewPort); + +impl AnyOuterViewPort { + pub fn downcast<V: View + ?Sized + 'static>(self) -> Result<OuterViewPort<V>, AnyViewPort> { + Ok(OuterViewPort(self.0.downcast::<V>()?)) + } +} + +impl<V: View + ?Sized + 'static> From<OuterViewPort<V>> for AnyOuterViewPort { + fn from(port: OuterViewPort<V>) -> Self { + AnyOuterViewPort(AnyViewPort{ + view: port.0.view as Arc<dyn Any + Send + Sync + 'static>, + observers: port.0.observers as Arc<dyn Any + Send + Sync + 'static> + }) + } +} + +impl AnyInnerViewPort { + pub fn downcast<V: View + ?Sized + 'static>(self) -> Result<InnerViewPort<V>, AnyViewPort> { + Ok(InnerViewPort(self.0.downcast::<V>()?)) + } +} + +impl<V: View + ?Sized + 'static> From<InnerViewPort<V>> for AnyInnerViewPort { + fn from(port: InnerViewPort<V>) -> Self { + AnyInnerViewPort(AnyViewPort{ + view: port.0.view as Arc<dyn Any + Send + Sync + 'static>, + observers: port.0.observers as Arc<dyn Any + Send + Sync + 'static> + }) + } +} + +//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> +