use html_macro::html; use virtual_node::{IterableNodes, VElement, VirtualNode}; /// A re-export of everything to get macros working smoothly pub mod prelude { pub use crate::component::Context; pub use crate::renderer::TextRenderer; pub use crate::types::FC; pub use crate::virtual_dom::VirtualDom; pub use html_macro::html; pub use virtual_node::{IterableNodes, VirtualNode}; } pub mod virtual_dom { use super::*; pub struct VirtualDom {} impl VirtualDom { pub fn new(root: types::FC) -> Self { Self {} } } } /// Virtual Node Support pub mod nodes { pub type VNode = virtual_node::VirtualNode; // pub enum VNode { // VText, // VElement, // VComponent, // } } /// Example on how to craft a renderer that interacts with the VirtualDom pub mod renderer { use crate::virtual_dom::VirtualDom; use super::*; /// Renders a full Dioxus app to a String /// pub struct TextRenderer {} impl TextRenderer { /// Create a new Text Renderer which renders the VirtualDom to a string pub fn new(dom: VirtualDom) -> Self { Self {} } pub fn render(&mut self) -> String { todo!() } } } pub mod component { /// A wrapper around component contexts that hides component property types pub struct AnyContext {} pub struct Context { _props: std::marker::PhantomData, } pub trait Properties {} impl Properties for () {} fn test() {} } /// Utility types that wrap internals pub mod types { use super::*; use component::{AnyContext, Context}; use nodes::VNode; pub type FC = fn(&mut AnyContext) -> VNode; } // #[cg(test)] mod integration_tests { use crate::prelude::*; /// Test a basic usage of a virtual dom + text renderer combo #[test] fn simple_integration() { let dom = VirtualDom::new(|_| html! {
Hello World!
}); let mut renderer = TextRenderer::new(dom); let output = renderer.render(); } }