pub trait Layout {
// Required method
fn render(&self, content: Node) -> Node;
// Provided method
fn render_many(&self, contents: Vec<Node>) -> Node { ... }
}Expand description
Wraps content in a consistent structure: a header, a footer, navigation.
§A footgun that does not exist here
Winged-Swift’s docs spend considerable space warning that HTMLTag is a reference type,
so reusing one instance in two places silently shares the node — which is why its
documented component pattern is “a function that returns a fresh tag each call”. In Rust
Node is a value type, so reuse copies. Write components however you like.
§Examples
use winged_rust::prelude::*;
use winged_rust::Layout;
struct Blog { site_title: String }
impl Layout for Blog {
fn render(&self, content: Node) -> Node {
body()
.child(header().child(h1().text(&self.site_title)))
.child(main_tag().child(content))
.child(footer().child(p().text("© 2026")))
.into()
}
}
let page = Blog { site_title: "RideKeeper".into() }.render(p().text("Hello").into());
assert!(page.render().contains("<h1>RideKeeper</h1>"));Required Methods§
Provided Methods§
Sourcefn render_many(&self, contents: Vec<Node>) -> Node
fn render_many(&self, contents: Vec<Node>) -> Node
Wraps several nodes, grouping them in a <div> first.
Matches the Swift extension, which also introduces a Div. Use
Node::fragment and Layout::render if you would rather not have the wrapper.
Dyn Compatibility§
This trait is dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".