sledgehammer_bindgen 0.6.0

Fast batched js bindings
Documentation
#![allow(unused)]
use sledgehammer_bindgen::bindgen;
use wasm_bindgen::prelude::wasm_bindgen;
use web_sys::{console, Node};

#[wasm_bindgen(module = "examples/typed_elements.js")]
extern "C" {
    #[wasm_bindgen]
    pub type TypedElements;
}

fn main() {
    #[bindgen]
    mod js {
        #[extends(TypedElements)]
        struct Channel;

        fn create_element(id: u16, element_id: u8) {
            "this.nodes[$id$]=document.createElement(this.els[$element_id$]);"
        }

        fn set_attribute(id: u16, attribute_id: u8, val: impl Writable<u8>) {
            "this.nodes[$id$].setAttribute(this.attrs[$attribute_id$],$val$);"
        }

        fn remove_attribute(id: u16, attribute_id: u8) {
            "this.nodes[$id$].removeAttribute(this.attrs[$attribute_id$]);"
        }

        fn append_child(id: u16, id2: u16) {
            "this.nodes[$id$].appendChild(this.nodes[$id2$]);"
        }

        fn insert_before(parent: u16, id: u16, id2: u16) {
            "this.nodes[$parent$].insertBefore(this.nodes[$id$],this.nodes[$id2$]);"
        }

        fn set_text(id: u16, text: impl Writable<u8>) {
            "this.nodes[$id$].textContent=$text$;"
        }

        fn remove(id: u16) {
            "this.nodes[$id$].remove();"
        }

        fn replace(id: u16, id2: u16) {
            "this.nodes[$id$].replaceWith(this.nodes[$id2$]);"
        }

        fn clone(id: u16, id2: u16) {
            "this.nodes[$id2$]=this.nodes[$id$].cloneNode(true);"
        }

        fn first_child(id: u16) {
            "this.nodes[id]=this.nodes[id].firstChild;"
        }

        fn next_sibling(id: u16) {
            "this.nodes[id]=this.nodes[id].nextSibling;"
        }
    }

    #[wasm_bindgen(inline_js = "
        export function get_node(channel, id){
            return channel.nodes[id];
        }
    ")]
    extern "C" {
        fn get_node(node: &JSChannel, id: u16) -> Node;
    }

    let mut channel1 = Channel::default();
    let main = 0;
    let node1 = 1;
    let node2 = 2;
    channel1.create_element(node1, Element::div as u8);
    channel1.create_element(node2, Element::span as u8);
    channel1.append_child(node1, node2);
    channel1.set_text(node2, "Hello World!");
    channel1.append_child(main, node1);
    channel1.flush();

    console::log_1(&get_node(channel1.js_channel(), 0).into());
}

#[allow(non_camel_case_types)]
#[repr(u8)]
enum Element {
    a,
    abbr,
    acronym,
    address,
    applet,
    area,
    article,
    aside,
    audio,
    b,
    base,
    bdi,
    bdo,
    bgsound,
    big,
    blink,
    blockquote,
    body,
    br,
    button,
    canvas,
    caption,
    center,
    cite,
    code,
    col,
    colgroup,
    content,
    data,
    datalist,
    dd,
    del,
    details,
    dfn,
    dialog,
    dir,
    div,
    dl,
    dt,
    em,
    embed,
    fieldset,
    figcaption,
    figure,
    font,
    footer,
    form,
    frame,
    frameset,
    h1,
    head,
    header,
    hgroup,
    hr,
    html,
    i,
    iframe,
    image,
    img,
    input,
    ins,
    kbd,
    keygen,
    label,
    legend,
    li,
    link,
    main,
    map,
    mark,
    marquee,
    menu,
    menuitem,
    meta,
    meter,
    nav,
    nobr,
    noembed,
    noframes,
    noscript,
    object,
    ol,
    optgroup,
    option,
    output,
    p,
    param,
    picture,
    plaintext,
    portal,
    pre,
    progress,
    q,
    rb,
    rp,
    rt,
    rtc,
    ruby,
    s,
    samp,
    script,
    section,
    select,
    shadow,
    slot,
    small,
    source,
    spacer,
    span,
    strike,
    strong,
    style,
    sub,
    summary,
    sup,
    table,
    tbody,
    td,
    template,
    textarea,
    tfoot,
    th,
    thead,
    time,
    title,
    tr,
    track,
    tt,
    u,
    ul,
    var,
    video,
    wbr,
    xmp,
}

#[allow(non_camel_case_types)]
#[repr(u8)]
enum Attribute {
    ccept_charset,
    accept,
    accesskey,
    action,
    align,
    allow,
    alt,
    aria_atomic,
    aria_busy,
    aria_controls,
    aria_current,
    aria_describedby,
    aria_description,
    aria_details,
    aria_disabled,
    aria_dropeffect,
    aria_errormessage,
    aria_flowto,
    aria_grabbed,
    aria_haspopup,
    aria_hidden,
    aria_invalid,
    aria_keyshortcuts,
    aria_label,
    aria_labelledby,
    aria_live,
    aria_owns,
    aria_relevant,
    aria_roledescription,
    r#async,
    autocapitalize,
    autocomplete,
    autofocus,
    autoplay,
    background,
    bgcolor,
    border,
    buffered,
    capture,
    challenge,
    charset,
    checked,
    cite,
    class,
    code,
    codebase,
    color,
    cols,
    colspan,
    content,
    contenteditable,
    contextmenu,
    controls,
    coords,
    crossorigin,
    csp,
    data,
    datetime,
    decoding,
    default,
    defer,
    dir,
    dirname,
    disabled,
    download,
    draggable,
    enctype,
    enterkeyhint,
    r#for,
    form,
    formaction,
    formenctype,
    formmethod,
    formnovalidate,
    formtarget,
    headers,
    height,
    hidden,
    high,
    href,
    hreflang,
    http_equiv,
    icon,
    id,
    importance,
    inputmode,
    integrity,
    intrinsicsize,
    ismap,
    itemprop,
    keytype,
    kind,
    label,
    lang,
    language,
    list,
    loading,
    r#loop,
    low,
    manifest,
    max,
    maxlength,
    media,
    method,
    min,
    minlength,
    multiple,
    muted,
    name,
    novalidate,
    open,
    optimum,
    pattern,
    ping,
    placeholder,
    poster,
    preload,
    radiogroup,
    readonly,
    referrerpolicy,
    rel,
    required,
    reversed,
    role,
    rows,
    rowspan,
    sandbox,
    scope,
    scoped,
    selected,
    shape,
    size,
    sizes,
    slot,
    span,
    spellcheck,
    src,
    srcdoc,
    srclang,
    srcset,
    start,
    step,
    style,
    summary,
    tabindex,
    target,
    title,
    translate,
    r#type,
    usemap,
    value,
    width,
    wrap,
}