sauron

Sauron is an html web framework for building web-apps. It is heavily inspired by elm.

Github stars Tracking Chart

sauron

Latest Version
Build Status
MIT licensed

sauron

One crate to rule the DOM

One crate to mind it

One crate to bring JSON

And in the Rust code bind it

This code, no other, is made by code elves

Who'd pawn parent process to get it themselves

Ruler of net troll and mortal and hacker

This code is a lib crate for Patreon backers

If trashed or buggy it cannot be remade

If found send to Ivan, the bandwidth is prepaid

-- The Harvard Lampoon & po8

Sauron is an html web framework for building web-apps with the goal of
closely adhering to The Elm Architecture, a paragon for elegant design.

As with elm, sauron follows the simplistic design of writing view code.

Example

use sauron::html::attributes::*;
use sauron::html::events::*;
use sauron::*;
use sauron::Component;
use sauron::Node;
use sauron::Program;
use sauron::Cmd;
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!"),
                        onclick(, _, {
                            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>

Note: You need to use the nightly compiler with minimum version: rustc 1.37.0-nightly (17e62f77f 2019-07-01)

Build using

$> wasm-pack build --target no-modules

Look at the examples
and the build script for the details.

Demo examples

  • data-viewer - A resizable spreadsheet csv data viewer
  • svg_clock - A clock drawn using svg and window tick event.
  • svg_graph - A simple graph using svg

Prerequisite:

cargo install wasm-pack
cargo install basic-http-server

Warning: I repeat, You need to use the latest nightly compiler in order for this to work.

This project is based on the existing projects:

Performance:

Benchmark

Please support this project:

Become a patron

Please contact me: ivanceras[at]gmail.com

License: MIT

Main metrics

Overview
Name With Ownerivanceras/sauron
Primary LanguageRust
Program languageRust (Language Count: 2)
Platform
License:MIT License
所有者活动
Created At2019-04-15 15:21:54
Pushed At2025-01-27 11:51:25
Last Commit At2025-01-27 19:51:25
Release Count113
Last Release Name0.61.9 (Posted on )
First Release Name0.1.0 (Posted on )
用户参与
Stargazers Count2k
Watchers Count29
Fork Count59
Commits Count2.3k
Has Issues Enabled
Issues Count40
Issue Open Count4
Pull Requests Count39
Pull Requests Open Count3
Pull Requests Close Count2
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private