use std::marker::PhantomData;
use crate::{DynamicValues, IntoDynNode};
use dioxus_core_template::TemplateRawTree;
use super::{View, ViewTemplate};
pub struct DynamicViewChildMarker<Marker>(PhantomData<Marker>);
pub struct DynamicNodeBuilder<N, Marker = ()> {
node: N,
_marker: PhantomData<Marker>,
}
#[inline]
pub fn dynamic_node_builder<N, Marker>(node: N) -> DynamicNodeBuilder<N, Marker>
where
N: IntoDynNode<Marker>,
{
DynamicNodeBuilder {
node,
_marker: PhantomData,
}
}
impl<N, Marker> ViewTemplate for DynamicNodeBuilder<N, Marker> {
const TEMPLATE_TREE: &'static TemplateRawTree = &TemplateRawTree::DynamicNode;
}
impl<N, Marker> View for DynamicNodeBuilder<N, Marker>
where
N: IntoDynNode<Marker>,
{
fn push(self, dynamic: &mut DynamicValues) {
dynamic.push_node(self.node.into_dyn_node());
}
}
#[doc(hidden)]
pub struct ViewChildMarker;
pub trait IntoViewChild<Marker = ViewChildMarker> {
type Output: View;
fn into_child(self) -> Self::Output;
}
impl<V: View> IntoViewChild<ViewChildMarker> for V {
type Output = V;
#[inline]
fn into_child(self) -> Self::Output {
self
}
}
impl<N, Marker> IntoViewChild<DynamicViewChildMarker<Marker>> for N
where
N: IntoDynNode<Marker>,
{
type Output = DynamicNodeBuilder<N, Marker>;
#[inline]
fn into_child(self) -> Self::Output {
dynamic_node_builder(self)
}
}