draco 0.1.2

Draco is a Rust library for building client side web applications with Web Assembly.
Documentation
use wasm_bindgen::prelude::*;

#[derive(Debug, Default)]
pub struct Form {
    username: String,
    password: String,
    accept: bool,
    is_submitting: bool,
}

pub enum Message {
    UpdateUsername(String),
    UpdatePassword(String),
    UpdateAccept(bool),
    Submit,
    Notify,
}

impl draco::App for Form {
    type Message = Message;

    fn update(&mut self, mailbox: &draco::Mailbox<Message>, message: Self::Message) {
        use self::Message::*;
        match message {
            UpdateUsername(username) => {
                self.username = username;
            }
            UpdatePassword(password) => {
                self.password = password;
            }
            UpdateAccept(accept) => {
                self.accept = accept;
            }
            Submit => {
                self.is_submitting = true;
                mailbox.send_after(1000, || Notify);
            }
            Notify => {
                self.is_submitting = false;
                web_sys::window()
                    .unwrap()
                    .alert_with_message(&format!("Submitted: {:?}", self))
                    .unwrap();
            }
        }
    }

    fn render(&self) -> draco::Node<Self::Message> {
        use draco::html as h;
        h::form()
            .on("submit", |event| {
                event.prevent_default();
                Message::Submit
            })
            .push(h::pre().push(format!("{:?}", self)))
            .push(h::label().attr("for", "username").push("Username: "))
            .push(
                h::input()
                    .attr("id", "username")
                    .attr("name", "username")
                    .attr("value", self.username.clone())
                    .on_input(Message::UpdateUsername),
            )
            .push(
                h::button()
                    .attr("type", "button")
                    .push("Clear")
                    .on("click", |_| Message::UpdateUsername("".into())),
            )
            .push(h::br())
            .push(h::label().attr("for", "password").push("Password: "))
            .push(
                h::input()
                    .attr("id", "password")
                    .attr("name", "password")
                    .attr("type", "password")
                    .attr("value", self.password.clone())
                    .on_input(Message::UpdatePassword),
            )
            .push(
                h::button()
                    .attr("type", "button")
                    .push("Clear")
                    .on("click", |_| Message::UpdatePassword("".into())),
            )
            .push(h::br())
            .push(h::label().attr("for", "accept").push("Accept "))
            .push(
                h::input()
                    .attr("id", "accept")
                    .attr("name", "accept")
                    .attr("type", "checkbox")
                    .checked(self.accept)
                    .on_checked(Message::UpdateAccept),
            )
            .push(
                h::button()
                    .attr("type", "button")
                    .push("Agree")
                    .on("click", |_| Message::UpdateAccept(true)),
            )
            .push(
                h::button()
                    .attr("type", "button")
                    .push("Disagree")
                    .on("click", |_| Message::UpdateAccept(false)),
            )
            .push(h::br())
            .push(if self.is_submitting {
                h::button().push("Submitting...").attr("disabled", "")
            } else {
                h::button().push("Submit")
            })
            .into()
    }
}

#[wasm_bindgen]
pub fn start() {
    draco::start(Form::default(), draco::select("main").expect("main").into());
}

pub fn main() {}