This project is archived in favor of Hirola
riot-rs-wasm showcases how to work with Riot and Rust, letting you play with the magic of web assembly
Play around with WebAssembly, Rust, Riot.js and TailwindCss
See demo here >> https://riot-rs-wasm.vercel.app/
You define the .riot component
the way you want.
Remember this is rust, so you can call any code as long as it meets the caveats of std-web
.
Lets start with the script part:
<script type="rust" module="counter">
use serde::{
Serialize,
Deserialize
};
#[derive(Serialize, Deserialize, Default)]
pub struct CounterState {
counter: i32
}
#[derive(Serialize, Deserialize)]
pub enum CounterAction {
increment(i32),
decrement(i32),
double
}
fn counter_reducer(state: CounterState, action: CounterAction) - > CounterState {
match action {
CounterAction::increment(i) => CounterState {
counter: state.counter + i
},
CounterAction::decrement(i) => CounterState {
counter: state.counter - i
},
CounterAction::double => CounterState {
counter: state.counter * 2
}
}
}
export!(counter_state, counter_dispatch, counter_reducer, CounterState, CounterAction);
</script>
- We defne the script type as
rust
for Riotjs processor. We also include a module name(which is idealy unique). - We define the state and reducer.
- We then expose our "rust code" to riot via
stdweb
There is nothing unique apart from each action name in the Action
enum is exposed to the component
<div class="flex bg-gray-100 py-24 justify-center">
<div class="p-12 text-center max-w-2xl">
<div class="md:text-3xl text-3xl font-bold">Your Counter is at { state.counter }</div>
<div class="text-xl font-normal mt-4">Play around with
</div>
<div class="mt-6 flex justify-center h-12 relative">
<button class=" shadow-md mx-2 font-medium py-2 px-4 text-green-100 cursor-pointer bg-green-600 rounded text-lg tr-mt" onclick={() => increment(1)}>Add +</button>
<button class=" shadow-md font-medium mx-2 py-2 px-4 text-red-100 cursor-pointer bg-green-600 rounded text-lg tr-mt " onclick={() => decrement(1)}>Subtract -</button>
<button class=" shadow-md font-medium mx-2 py-2 px-4 text-yellow-100cursor-pointer bg-green-600 rounded text-lg tr-mt" onclick={() => double()}>Double * 2</button>
</div>
</div>
</div>
And thats it for now!
To run
$ yarn start
To build
$ yarn build
[-] - Actions
[ ] - Component Lifecyle
[ ] - Custom riotjs plugin?
[ ] - Write tests?
[ ] - `create-riot-wasm-app`?
Feel free to create a PR
Inspired by RiotJs, Redux and Yew among others