# 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
   |
20 |         value: "my value"
   |         ^^^^^ `wurst::elements::DivElement` does not have this field
   |
   = 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.
