squark

crates.io docs.rs

Virtual DOM implemention and definitions of Application and Runtime.

Fertures

This repository includes

Currently, we depend on nightly channel

squark-macros

crates.io docs.rs

Crate that providing JSX like macro by proc_marco and pest parser.

Syntax

view! { <button class="some-class" onclick={ |_| { Some(Action::Submit) }> Button! </button> }

We can generate native Rust expression at compile-time.

squark-web

crates.io docs.rs

Runtime implemention for web browser with usinng wasm-bindgen.

Here is full example of counter app!

```rust

![feature(procmacronon_items)]

extern crate squark; extern crate squarkmacros; extern crate squarkweb; extern crate wasm_bindgen;

use squark::{App, Runtime, View}; use squarkmacros::view; use squarkweb::WebRuntime; use wasm_bindgen::prelude::*;

[derive(Clone, Debug, PartialEq)]

struct State { count: isize, }

impl State { pub fn new() -> State { State { count: 0 } } }

[derive(Clone, Debug)]

enum Action { ChangeCount(isize), }

[derive(Clone, Debug)]

struct CounterApp; impl App for CounterApp { type State = State; type Action = Action;

fn reducer(mut state: State, action: Action) -> State {
    match action {
        Action::ChangeCount(c) => {
            state.count = c;
        }
    };
    state
}

fn view(state: State) -> View<Action> {
    let count = state.count;
    view! {
        <div>
            { count.to_string() }
            <button onclick={ move |_| Some(Action::ChangeCount(count.clone() + 1)) }>
                increment
            </button>
            <button onclick={ move |_| Some(Action::ChangeCount(count - 1)) }>
                decrement
            </button>
        </div>
    }
}

}

[wasm_bindgen]

pub fn run() { WebRuntime::::new( squarkweb::web::document.queryselector("body"), State::new(), ).run(); } ```

Project dir is located at examples/counter.

There is also available TodoMVC example at examples/todomvc and working on https://rail44.github.io/squark/.