wsdom_macros_decl/
expander.rs

1#[macro_export]
2macro_rules! expand_class_def {
3    ($generics_for_phantom:ty, [$($impl_generics:tt)*], $name_without_bound:ty, $name:ident, [$($decl_generics:tt)*], $first_extend:ty, $($all_extends:ty,)*) => {
4        #[derive(::core::clone::Clone, __wsdom_load_ts_macro::RefCast)]
5        #[repr(transparent)]
6        pub struct $name $($decl_generics)* (__wsdom_load_ts_macro::JsValue, ::core::marker::PhantomData<$generics_for_phantom> );
7        impl $($impl_generics)* __wsdom_load_ts_macro::JsCast for $name_without_bound
8        {
9            fn unchecked_from_js(val: __wsdom_load_ts_macro::JsValue) -> Self {
10                Self(val, ::core::marker::PhantomData)
11            }
12            fn unchecked_from_js_ref(val: &__wsdom_load_ts_macro::JsValue) -> &Self {
13                __wsdom_load_ts_macro::RefCast::ref_cast(val)
14            }
15        }
16        impl $($impl_generics)* __wsdom_load_ts_macro::UseInJsCode for $name_without_bound
17        {
18            fn serialize_to(&self, buf: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
19                self.0.serialize_to(buf)
20            }
21        }
22
23        impl $($impl_generics)* ::core::convert::AsRef<Self> for $name_without_bound
24        {
25            fn as_ref(&self) -> &Self {
26                self
27            }
28        }
29
30        impl $($impl_generics)* std::ops::Deref for $name_without_bound
31        {
32            type Target = $first_extend;
33            fn deref(&self) -> &Self::Target {
34                self.as_ref()
35            }
36        }
37        __wsdom_load_ts_macro::expand_class_def!(extend @ [$($impl_generics)*], $name_without_bound, $($all_extends,)*);
38    };
39    (extend @ [$($impl_generics:tt)*], $name_without_bound:ty, $extend:ty, $($extends_rest:ty,)*) => {
40        impl $($impl_generics)* ::core::convert::AsRef<$extend> for $name_without_bound
41        {
42            fn as_ref(&self) -> &$extend {
43                __wsdom_load_ts_macro::JsCast::unchecked_from_js_ref(&self.0)
44            }
45        }
46        impl $($impl_generics)* ::core::convert::Into<$extend> for $name_without_bound
47        {
48            fn into(self) -> $extend {
49                __wsdom_load_ts_macro::JsCast::unchecked_from_js(self.0)
50            }
51        }
52        __wsdom_load_ts_macro::expand_class_def!(extend @ [$($impl_generics)*], $name_without_bound, $($extends_rest,)*);
53    };
54    (extend @ [$($impl_generics:tt)*], $name_without_bound:ty, ) => {
55
56    };
57}
58
59#[macro_export]
60macro_rules! expand_field_getter_setter {
61    (self @ $getter_name:ident, $getter_ty:ty, $setter_name:ident, $setter_ty:ty, $field_name:literal) => {
62        pub fn $getter_name(&self) -> $getter_ty {
63            __wsdom_load_ts_macro::JsCast::unchecked_from_js(
64                __wsdom_load_ts_macro::JsObject::js_get_field(self.as_ref(), &$field_name),
65            )
66        }
67        pub fn $setter_name(&self, value: $setter_ty) {
68            __wsdom_load_ts_macro::JsObject::js_set_field(
69                self.as_ref(),
70                &$field_name,
71                __wsdom_load_ts_macro::UpcastWorkaround::new(value).cast(),
72            )
73        }
74    };
75    (browser @ $getter_name:ident, $getter_ty:ty, $setter_name:ident, $setter_ty:ty, $field_name:literal, $iface_name:literal) => {
76        pub fn $getter_name(browser: &__wsdom_load_ts_macro::Browser) -> $getter_ty {
77            __wsdom_load_ts_macro::JsCast::unchecked_from_js(browser.get_field(
78                &__wsdom_load_ts_macro::RawCodeImmediate($iface_name),
79                &$field_name,
80            ))
81        }
82        pub fn $setter_name(browser: &__wsdom_load_ts_macro::Browser, value: $setter_ty) {
83            browser.set_field(
84                &__wsdom_load_ts_macro::RawCodeImmediate($iface_name),
85                &$field_name,
86                __wsdom_load_ts_macro::UpcastWorkaround::new(value).cast(),
87            )
88        }
89    };
90}
91
92#[macro_export]
93macro_rules! expand_method {
94    (self @ $method_name:ident, [$($generics:tt)*], [$($arg_names:ident : $arg_types:ty,)*], $ret:ty, $js_name:literal, $last_variadic:literal) => {
95        pub fn $method_name $($generics)* (&self, $($arg_names: $arg_types,)*) -> $ret {
96            __wsdom_load_ts_macro::JsCast::unchecked_from_js(
97                __wsdom_load_ts_macro::JsObject::js_call_method(self.as_ref(), $js_name, [
98                    $(  __wsdom_load_ts_macro::UpcastWorkaround::new( $arg_names ).cast(), )*
99                ], $last_variadic)
100            )
101        }
102    };
103    (constructor @ $method_name:ident, [$($generics:tt)*], [$($arg_names:ident : $arg_types:ty,)*], $ret:ty, $interface_name:literal, $last_variadic:literal) => {
104        pub fn $method_name $($generics)* (browser: &__wsdom_load_ts_macro::Browser, $($arg_names: $arg_types,)*) -> $ret {
105            __wsdom_load_ts_macro::JsCast::unchecked_from_js(
106                browser.call_constructor($interface_name, [
107                    $(  __wsdom_load_ts_macro::UpcastWorkaround::new( $arg_names ).cast(), )*
108                ], $last_variadic)
109            )
110        }
111    };
112    (free @ $method_name:ident, [$($generics:tt)*], [$($arg_names:ident : $arg_types:ty,)*], $ret:ty, $function_name:literal, $last_variadic:literal) => {
113        pub fn $method_name $($generics)* (browser: &__wsdom_load_ts_macro::Browser, $($arg_names: $arg_types,)*) -> $ret {
114            __wsdom_load_ts_macro::JsCast::unchecked_from_js(
115                browser.call_function($function_name, [
116                    $(  __wsdom_load_ts_macro::UpcastWorkaround::new( $arg_names ).cast(), )*
117                ], $last_variadic)
118            )
119        }
120    };
121}