From 6679e3492557a6295a86da0c807f600292cd46d2 Mon Sep 17 00:00:00 2001 From: Luke Chu <37006668+lukechu10@users.noreply.github.com> Date: Sat, 3 Jul 2021 19:43:03 -0700 Subject: [PATCH] GenericNode::first_child --- packages/sycamore/src/generic_node.rs | 3 +++ packages/sycamore/src/generic_node/dom_node.rs | 7 +++++++ packages/sycamore/src/generic_node/ssr_node.rs | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/packages/sycamore/src/generic_node.rs b/packages/sycamore/src/generic_node.rs index da0cd8a1e..5a8186b8d 100644 --- a/packages/sycamore/src/generic_node.rs +++ b/packages/sycamore/src/generic_node.rs @@ -60,6 +60,9 @@ pub trait GenericNode: fmt::Debug + Clone + PartialEq + Eq + Hash + 'static { /// Appends a child to the node's children. fn append_child(&self, child: &Self); + /// Get the first child of the node. + fn first_child(&self) -> Option; + /// Insert a new child node to this node's children. If `reference_node` is `Some`, the child /// will be inserted before the reference node. Else if `None`, the child will be inserted /// at the end. diff --git a/packages/sycamore/src/generic_node/dom_node.rs b/packages/sycamore/src/generic_node/dom_node.rs index b0c9efc5d..b31121539 100644 --- a/packages/sycamore/src/generic_node/dom_node.rs +++ b/packages/sycamore/src/generic_node/dom_node.rs @@ -175,6 +175,13 @@ impl GenericNode for DomNode { self.node.append_child(&child.node).unwrap(); } + fn first_child(&self) -> Option { + self.node.first_child().map(|node| Self { + id: Default::default(), + node: Rc::new(node), + }) + } + fn insert_child_before(&self, new_node: &Self, reference_node: Option<&Self>) { self.node .insert_before(&new_node.node, reference_node.map(|n| n.node.as_ref())) diff --git a/packages/sycamore/src/generic_node/ssr_node.rs b/packages/sycamore/src/generic_node/ssr_node.rs index 181dd5857..2cfae4f3c 100644 --- a/packages/sycamore/src/generic_node/ssr_node.rs +++ b/packages/sycamore/src/generic_node/ssr_node.rs @@ -138,6 +138,13 @@ impl GenericNode for SsrNode { } } + fn first_child(&self) -> Option { + match self.0.ty.as_ref() { + SsrNodeType::Element(element) => element.borrow_mut().children.first().cloned(), + _ => panic!("node type cannot have children"), + } + } + fn insert_child_before(&self, new_node: &Self, reference_node: Option<&Self>) { if let Some(reference_node) = reference_node { debug_assert_eq!(