draco 0.1.2

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

pub mod counter {
    #[derive(Default)]
    pub struct Counter {
        value: i32,
    }

    pub enum Message {
        Increment,
        Decrement,
        Reset,
        Remove,
    }

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

        fn update(&mut self, _: &draco::Mailbox<Message>, message: Self::Message) {
            use self::Message::*;
            match message {
                Increment => self.value += 1,
                Decrement => self.value -= 1,
                Reset => self.value = 0,
                Remove => {}
            }
        }

        fn render(&self) -> draco::Node<Self::Message> {
            use draco::html as h;
            h::div()
                .push(h::button().push("-").on("click", |_| Message::Decrement))
                .push(self.value)
                .push(h::button().push("+").on("click", |_| Message::Increment))
                .push(h::button().push("Reset").on("click", |_| Message::Reset))
                .push(h::button().push("Remove").on("click", |_| Message::Remove))
                .into()
        }
    }
}

#[derive(Default)]
pub struct Counters {
    counters: Vec<Counter>,
}

pub enum Message {
    Append,
    Counter(usize, counter::Message),
}

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

    fn update(&mut self, mailbox: &draco::Mailbox<Message>, message: Self::Message) {
        match message {
            Message::Append => self.counters.push(Counter::default()),
            Message::Counter(index, counter::Message::Remove) => {
                self.counters.remove(index);
            }
            Message::Counter(index, message) => {
                self.counters[index].update(
                    &mailbox
                        .clone()
                        .map(move |message| Message::Counter(index, message)),
                    message,
                );
            }
        }
    }

    fn render(&self) -> draco::Node<Self::Message> {
        use draco::html as h;
        h::div()
            .push(h::button().push("Append").on("click", |_| Message::Append))
            .append(self.counters.iter().enumerate().map(|(index, counter)| {
                counter
                    .render()
                    .map(move |message| Message::Counter(index, message))
            }))
            .into()
    }
}

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

pub fn main() {}