1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#[macro_export]
macro_rules! web_component {
    ($name:ident) => {
        paste::item! {
            #[wasm_bindgen::prelude::wasm_bindgen]
            pub fn [<components_web_ $name:lower _create>](attributes: NamedNodeMap) -> usize {
                let object = $name::create_component(attributes);
                unsafe {
                    $crate::objects_register::OBJECTS_REGISTER.register_object(Box::new(object))
                }
            }

            #[wasm_bindgen::prelude::wasm_bindgen]
            pub fn [<components_web_ $name:lower _update_field>](object: usize, name: String, value: String) {
                unsafe {
                    let object = $crate::objects_register::OBJECTS_REGISTER.object(object);
                    object.update_field(&name, &value);
                    object.field_updated(&name);
                }
            }

            #[wasm_bindgen::prelude::wasm_bindgen]
            pub fn [<components_web_ $name:lower _get_data>](object: usize) -> String {
                unsafe {
                    let object = $crate::objects_register::OBJECTS_REGISTER.object(object);
                    object.get_data()
                }
            }

            #[wasm_bindgen::prelude::wasm_bindgen]
            pub fn [<components_web_ $name:lower _on_loaded>](object:usize, shadow_root:ShadowRoot) {
                unsafe {
                    let object = $crate::objects_register::OBJECTS_REGISTER.object(object);
                    object.on_loaded(shadow_root);
                }
            }
        }
    }
}

#[macro_export]
macro_rules! template {
    ($name:ident) => {
        paste::item! {
            #[wasm_bindgen::prelude::wasm_bindgen]
            pub fn [<components_web_ $name:lower _template>]() -> String {
                include_str!("template.html").to_string()
            }
        }
    }
}

#[macro_export]
macro_rules! package {
    () => {
        #[wasm_bindgen::prelude::wasm_bindgen]
        pub fn web_component_target_wasm() {}
    }
}

#[macro_export]
macro_rules! update_field {
    ($self:ident, $name:ident, $value:ident $(,$property:ident)*) => {
        $(
            if $name == stringify!($property) {
                $self.$property = serde_json::from_str(&$value).unwrap();
            }
        )*
    }
}