use dioxus_native_core::node_ref::*; use dioxus_native_core::state::{ChildDepState, NodeDepState, ParentDepState, State}; use dioxus_native_core_macro::State; #[derive(Debug, Clone, PartialEq, Default)] struct BubbledUpStateTester(Option, Vec>); impl ChildDepState for BubbledUpStateTester { type Ctx = u32; type DepState = Self; const NODE_MASK: NodeMask = NodeMask::new(AttributeMask::NONE, true, false, false); fn reduce<'a>( &mut self, node: NodeView, children: impl Iterator, ctx: &Self::Ctx, ) -> bool where Self::DepState: 'a, { assert_eq!(*ctx, 42); *self = BubbledUpStateTester( node.tag().map(|s| s.to_string()), children.into_iter().map(|c| Box::new(c.clone())).collect(), ); true } } #[derive(Debug, Clone, PartialEq, Default)] struct PushedDownStateTester(Option, Option>); impl ParentDepState for PushedDownStateTester { type Ctx = u32; type DepState = Self; const NODE_MASK: NodeMask = NodeMask::new(AttributeMask::NONE, true, false, false); fn reduce(&mut self, node: NodeView, parent: Option<&Self::DepState>, ctx: &Self::Ctx) -> bool { assert_eq!(*ctx, 42); *self = PushedDownStateTester( node.tag().map(|s| s.to_string()), parent.map(|c| Box::new(c.clone())), ); true } } #[derive(Debug, Clone, PartialEq, Default)] struct NodeStateTester(Option, Vec<(String, String)>); impl NodeDepState for NodeStateTester { type Ctx = u32; type DepState = (); const NODE_MASK: NodeMask = NodeMask::new(AttributeMask::All, true, false, false); fn reduce(&mut self, node: NodeView, _sibling: &Self::DepState, ctx: &Self::Ctx) -> bool { assert_eq!(*ctx, 42); *self = NodeStateTester( node.tag().map(|s| s.to_string()), node.attributes() .map(|a| (a.name.to_string(), a.value.to_string())) .collect(), ); true } } #[derive(State, Clone, Default, Debug)] struct StateTester { #[child_dep_state(bubbled, u32)] bubbled: BubbledUpStateTester, #[parent_dep_state(pushed, u32)] pushed: PushedDownStateTester, #[node_dep_state(NONE, u32)] node: NodeStateTester, }