squark

Rust frontend framework, for web browser and more.

Currently, we depend on nightly channel

Design

crates

squark

crates.io docs.rs

Core crate.

squark-macros

crates.io docs.rs

It provides macro like JSX for helping writing view.
Very thanks to 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(procmacrohygiene)]

extern crate squark; extern crate squarkmacros; extern crate squarkweb; extern crate wasmbindgen; extern crate websys;

use squark::{App, Runtime, View, Task}; use squarkmacros::view; use squarkweb::WebRuntime; use wasmbindgen::prelude::*; use websys::window;

[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(&self, mut state: State, action: Action) -> (State, Task<Action>) {
    match action {
        Action::ChangeCount(c) => {
            state.count = c;
        }
    };
    (state, Task::empty())
}

fn view(&self, 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>
    }
}

}

impl Default for CounterApp { fn default() -> CounterApp { CounterApp } }

[wasm_bindgen]

pub fn run() { WebRuntime::::new( window() .unwrap() .document() .expect("Failed to get document") .query_selector("body") .unwrap() .unwrap(), State::new(), ) .run(); } ```

Project dir is located at examples/counter.

There are some other examples available on examples, most of them use rust-webpack-template.
TodoMVC is working on https://rail44.github.io/squark/.