a virtual view transaction renderer for the dom
bash
$ cargo install cargo-web
bash
$ make
```rust
extern crate stdweb;
extern crate serde_json;
extern crate virtualview; extern crate virtualview_dom;
use std::sync::{Arc, Mutex}; use std::sync::atomic::{AtomicIsize, Ordering};
use stdweb::web::{document, set_timeout};
use virtualview::{EventManager, Event, View, Renderer}; use virtualview_dom::Patcher;
static COUNT: AtomicIsize = AtomicIsize::new(0isize);
static mut PATCHER: Option
fn onaddcount(: &mut Event) { COUNT.fetchadd(1, Ordering::Relaxed); enqueuerender(); } fn onsubcount(: &mut Event) { COUNT.fetchsub(1, Ordering::Relaxed); enqueuerender(); }
fn counterrender(count: isize) -> View { virtualview! {
fn render() { let patcher = unsafe { PATCHER.asmut().unwrap() }; let renderer = unsafe { RENDERER.asmut().unwrap() }; let eventmanager = unsafe { EVENTMANAGER.asref().unwrap() }; let count = COUNT.load(Ordering::Relaxed); let view = counterrender(count); let transaction = renderer.render(view, &mut *eventmanager.lock().expect("failed to acquire eventmanager lock")); patcher.patch(&transaction); }
fn enqueuerender() { settimeout(render, 0); }
fn main() { stdweb::initialize();
let event_manager = Arc::new(Mutex::new(EventManager::new()));
let patcher = Patcher::new(document().get_element_by_id("app").unwrap().into(), document(), event_manager.clone());
let renderer = Renderer::new();
unsafe {
PATCHER = Some(patcher);
RENDERER = Some(renderer);
EVENT_MANAGER = Some(event_manager);
}
enqueue_render();
stdweb::event_loop();
} ```