draco 0.1.2

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

const KEY: &str = "draco.examples.local_storage";

#[derive(Debug)]
pub struct LocalStorage {
    value: String,
}

impl LocalStorage {
    fn new() -> Self {
        LocalStorage {
            value: Self::storage()
                .get_item(KEY)
                .expect("get_item")
                .unwrap_or("".into()),
        }
    }

    fn storage() -> web_sys::Storage {
        web_sys::window()
            .expect("window")
            .local_storage()
            .expect("window.local_storage")
            .expect("window.local_storage")
    }
}

pub enum Message {
    Update(String),
}

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

    fn update(&mut self, _: &draco::Mailbox<Message>, message: Self::Message) {
        match message {
            Message::Update(value) => {
                Self::storage().set_item(KEY, &value).expect("set_item");
                self.value = value;
            }
        }
    }

    fn render(&self) -> draco::Node<Self::Message> {
        use draco::html as h;
        h::div()
            .push(h::p().push("Type anything below."))
            .push(h::p().push(
                "The value is automatically stored in LocalStorage and restored on page load.",
            ))
            .push(
                h::textarea()
                    .attr("value", self.value.clone())
                    .on_input(Message::Update),
            )
            .push(
                h::button()
                    .push("Clear")
                    .on("click", |_| Message::Update("".into())),
            )
            .push(h::pre().push(format!("{:?}", self)))
            .into()
    }
}

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

pub fn main() {}