# WURST
Webby DOM abstraction of [web-sys](https://rustwasm.github.io/wasm-bindgen/api/web_sys/).
## Project Aims
- Wrap all the DOM APIs and provide an ergonomic easy to use library
- Provide compile time checking of Front End code.
- Have an escape hatch to the DOM for runtime checking.
- Provide a zero cost abstraction on top of the DOM
# Setup
Currently this code is only tested with Nighly and the latest wasm-bindgen.
Given we are in an unreleased state at the moment, please enusre you have the latest wasm-bindgen binary:
```
rustup update
cargo install -f wasm-bindgen-cli
```
To enable well formatted generated code:
```
export WEBIDL_RUSTFMT_BINDINGS=1;
```
I'm also only checking this on Nightly at the moment. Other builds may work.
## Example
[Form Example](/examples/form-example/src/lib.rs)
To run a demo server:
```
cd examples/form-example/;
source build.sh
```
## Usage
Current usage of the library:
```rust
let mut div = create_element!("div", {
// Element interface
id: "Boop",
// HTMLElement interface
title: "hey I am a title",
lang: "en-GB"
});
div.create();
div.add_to_body();
let mut input = create_element!("input", {
// Element interface
id: "Boop",
// Input interface
value: "hey!",
// HTMLElement interface
title: "2323",
lang: "boom"
});
input.create();
input.add_to_body();
input.attrs.id = Some("boo".into());
input.update();
```
The above code internally will return an `El` which implements an `Elementish` field trait.
The concrete types are `DivElement` and `InputElement` respectively.
The macro will only accept what the concrete interface will accept. So providing the wrong element attributes to the macro will fail at compile time:
```
error[E0560]: struct `wurst::elements::DivElement` has no field named `value`
--> src/main.rs:20:9
|
|
= note: available fields are: `title`, `lang`, `dir`, `inner_text`, `access_key` ... and 3 others
error: aborting due to previous error
```
## License
Licensed under either of
* Apache License, Version 2.0
([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
* MIT license
([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
at your option.
## Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.