From a35d336dc9a61fda931f4a9158205d590af87bd5 Mon Sep 17 00:00:00 2001 From: Ashelyn Rose Date: Fri, 18 Oct 2024 18:08:40 -0600 Subject: Basic sync rendering --- src/lib.rs | 7 +++++++ src/render.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/lib.rs create mode 100644 src/render.rs (limited to 'src') diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..717d715 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,7 @@ +mod render; + +pub use render::{Component, RenderNode}; + +pub fn render_tree(parent_node: RenderNode) -> String { + parent_node.render_to_string() +} diff --git a/src/render.rs b/src/render.rs new file mode 100644 index 0000000..33469e0 --- /dev/null +++ b/src/render.rs @@ -0,0 +1,49 @@ +use std::collections::HashMap; + +pub trait Component { + fn render(self: Box) -> Vec; +} + +pub enum RenderNode { + Component(Box), + Element { + name: String, + attributes: HashMap, + children: Vec + }, + TextNode { + content: String, + }, + Portal, + Null, +} + +impl RenderNode { + pub(crate) fn render_to_string(self) -> String { + match self { + RenderNode::Component(component) => { + let elements = component.render(); + elements.into_iter() + .map(|child| child.render_to_string()) + .collect::>().join("") + + }, + + RenderNode::Element { name, attributes, children } => { + let text_attributes = attributes.into_iter() + .map(|(key, value)| format!(" {key}=\"{value}\"")) + .collect::>().join(""); + + let rendered_children = children.into_iter() + .map(|child| child.render_to_string()) + .collect::>().join(""); + + format!("<{name}{text_attributes}>{rendered_children}") + }, + + RenderNode::TextNode { content } => content, + RenderNode::Portal => todo!(), + RenderNode::Null => "".to_string(), + } + } +} -- cgit 1.4.1