

Sauron is an HTML web framework for building web-apps with the goal of
closely adhering to The Elm Architecture, a paragon of elegant design.
Sauron follow Elm's simplistic design of writing view code.
use sauron::prelude::*;
use wasm_bindgen::prelude::*;
use log::*;
#[derive(Debug, PartialEq, Clone)]
pub enum Msg {
Click,
}
pub struct App {
click_count: u32,
}
impl App {
pub fn new() -> Self {
App { click_count: 0 }
}
}
impl Component<Msg> for App {
fn view(&self) -> Node<Msg> {
div!(
[class("some-class"), id("some-id"), attr("data-id", 1)],
[
input!(
[
class("client"),
type_("button"),
value("Click me!"),
on_click(|_| {
trace!("Button is clicked");
Msg::Click
}),
],
[],
),
text!("Clicked: {}", self.click_count),
],
)
}
fn update(&mut self, msg: Msg) -> Cmd<Self, Msg> {
trace!("App is updating from msg: {:?}", msg);
match msg {
Msg::Click => {
self.click_count += 1;
Cmd::none()
}
}
}
}
#[wasm_bindgen(start)]
pub fn main() {
Program::mount_to_body(App::new());
}
index.html
<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/>
<title>Minimal sauron app</title>
</head>
<body>
<script src='pkg/minimal.js'></script>
<script type=module>
window.wasm_bindgen('pkg/minimal_bg.wasm')
.catch(console.error);
</script>
</body>
</html>
In Cargo.toml, specify the crate-type to be cdylib
[lib]
crate-type = ["cdylib"]
Build using
$> wasm-pack build --target no-modules
Look at the examples
and the build script for the details.
html2sauron - A tool to easily convert html into
sauron node tree for your views.
Note: When writing the view in sauron, just keep in mind that the function name is the element tag
you are creating and there is 2 arguments for it. The first argument is an array of the attributes of the element
and the second argument is an array of the children of the element.
Example:
div!([id("container"),class("hero")], [text("Content goes here")])
div macro call is the element tag.
The 1st argument in the call is an array of attributes for the div element expressed in a
function call id and class which are valid attributes for a div.
The 2nd argument in the call is an array of the children elements, and you can nest as many as
you like.
cargo install wasm-pack
cargo install basic-http-server
Sauron is one of the fastest.

Benchmark 1
Benchmark 2

| a | TODO:
|
| abbr | TODO:
|
| address | TODO:
|
| animate | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| animateMotion | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| animateTransform | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| area | TODO:
|
| article | TODO:
|
| aside | TODO:
|
| audio | TODO:
|
| b | TODO:
|
| base | TODO:
|
| bdi | TODO:
|
| bdo | TODO:
|
| blockquote | TODO:
|
| body | TODO:
|
| br | TODO:
|
| button | TODO:
|
| canvas | TODO:
|
| caption | TODO:
|
| circle | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| cite | TODO:
|
| clipPath | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| code | TODO:
|
| col | TODO:
|
| colgroup | TODO:
|
| data | TODO:
|
| datalist | TODO:
|
| dd | TODO:
|
| declare_attributes | declare a function with the name corresponds to attribute name for easy usage in html elements
Example:
|
| defs | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| del | TODO:
|
| desc | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| details | TODO:
|
| dfn | TODO:
|
| dialog | TODO:
|
| discard | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| div | TODO:
|
| dl | TODO:
|
| dt | TODO:
|
| ellipse | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| em | TODO:
|
| embed | TODO:
|
| feBlend | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feColorMatrix | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feComponentTransfer | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feComposite | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feConvolveMatrix | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feDiffuseLighting | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feDisplacementMap | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feDistantLight | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feDropShadow | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feFlood | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feFuncA | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feFuncB | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feFuncG | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feFuncR | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feGaussianBlur | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feImage | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feMerge | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feMergeNode | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feMorphology | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feOffset | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| fePointLight | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feSpecularLighting | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feSpotLight | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feTile | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| feTurbulence | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| fieldset | TODO:
|
| figcaption | TODO:
|
| figure | TODO:
|
| filter | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| footer | TODO:
|
| foreignObject | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| form | TODO:
|
| g | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| h1 | TODO:
|
| h2 | TODO:
|
| h3 | TODO:
|
| h4 | TODO:
|
| h5 | TODO:
|
| h6 | TODO:
|
| hatch | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| hatchpath | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| head | TODO:
|
| header | TODO:
|
| hgroup | TODO:
|
| hr | TODO:
|
| html | TODO:
|
| i | TODO:
|
| iframe | TODO:
|
| image | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| img | TODO:
|
| input | TODO:
|
| ins | TODO:
|
| kbd | TODO:
|
| label | TODO:
|
| legend | TODO:
|
| li | TODO:
|
| linearGradient | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| link | TODO:
|
| main | TODO:
|
| map | TODO:
|
| mark | TODO:
|
| marker | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| mask | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| menu | TODO:
|
| menuitem | TODO:
|
| mesh | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| meshgradient | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| meshpatch | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| meshrow | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| meta | TODO:
|
| metadata | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| meter | TODO:
|
| mpath | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| nav | TODO:
|
| noscript | TODO:
|
| object | TODO:
|
| ol | TODO:
|
| optgroup | TODO:
|
| option | TODO:
|
| output | TODO:
|
| p | TODO:
|
| param | TODO:
|
| path | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| pattern | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| picture | TODO:
|
| polygon | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| polyline | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| pre | TODO:
|
| progress | TODO:
|
| q | TODO:
|
| radialGradient | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| rb | TODO:
|
| rect | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| rp | TODO:
|
| rt | TODO:
|
| rtc | TODO:
|
| ruby | TODO:
|
| s | TODO:
|
| samp | TODO:
|
| script | TODO:
|
| section | TODO:
|
| select | TODO:
|
| set | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| slot | TODO:
|
| small | TODO:
|
| solidcolor | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| source | TODO:
|
| span | TODO:
|
| stop | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| strong | TODO:
|
| style | a utility function for convenient styling of elements
|
| sub | TODO:
|
| summary | TODO:
|
| sup | TODO:
|
| svg | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| switch | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| symbol | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| table | TODO:
|
| tbody | TODO:
|
| td | TODO:
|
| template | TODO:
|
| text | creates a text node
Example
|
| textPath | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| textarea | TODO:
|
| tfoot | TODO:
|
| th | TODO:
|
| thead | TODO:
|
| time | TODO:
|
| title | TODO:
|
| tr | TODO:
|
| track | TODO:
|
| tspan | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| u | TODO:
|
| ul | TODO:
|
| unknown | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| var | TODO:
|
| video | TODO:
|
| view | name is the supplied ident in declare_tags_macro
This creates an alternative macro call to the tag function
This has a more cleaner syntax since it removes the need for using vec![]
for both the attributes and the children
|
| wbr | TODO:
|