use tsify_next::Tsify; #[tsify(into_wasm_abi, from_wasm_abi)] pub enum GenericEnum { Unit, NewType(T), Seq(T, U), Map { x: T, y: U }, } #[automatically_derived] const _: () = { extern crate serde as _serde; use tsify_next::Tsify; use wasm_bindgen::{ convert::{ FromWasmAbi, VectorFromWasmAbi, IntoWasmAbi, VectorIntoWasmAbi, OptionFromWasmAbi, OptionIntoWasmAbi, RefFromWasmAbi, }, describe::WasmDescribe, describe::WasmDescribeVector, prelude::*, }; #[wasm_bindgen] extern "C" { #[wasm_bindgen(typescript_type = "GenericEnum")] pub type JsType; } impl Tsify for GenericEnum { type JsType = JsType; const DECL: &'static str = "export type GenericEnum = \"Unit\" | { NewType: T } | { Seq: [T, U] } | { Map: { x: T; y: U } };"; const SERIALIZATION_CONFIG: tsify_next::SerializationConfig = tsify_next::SerializationConfig { missing_as_null: false, hashmap_as_object: false, large_number_types_as_bigints: false, }; } #[wasm_bindgen(typescript_custom_section)] const TS_APPEND_CONTENT: &'static str = "export type GenericEnum = \"Unit\" | { NewType: T } | { Seq: [T, U] } | { Map: { x: T; y: U } };"; impl WasmDescribe for GenericEnum { #[inline] fn describe() { ::JsType::describe() } } impl WasmDescribeVector for GenericEnum { #[inline] fn describe_vector() { ::JsType::describe_vector() } } impl IntoWasmAbi for GenericEnum where GenericEnum: _serde::Serialize, { type Abi = ::Abi; #[inline] fn into_abi(self) -> Self::Abi { match self.into_js() { Ok(js) => js.into_abi(), Err(err) => { let loc = core::panic::Location::caller(); let msg = { let res = ::alloc::fmt::format( format_args!( "(Converting type failed) {0} ({1}:{2}:{3})", err, loc .file(), loc.line(), loc.column(), ), ); res }; { #[cold] #[track_caller] #[inline(never)] #[rustc_const_panic_str] #[rustc_do_not_const_check] const fn panic_cold_display( arg: &T, ) -> ! { ::core::panicking::panic_display(arg) } panic_cold_display(&msg); }; } } } } impl OptionIntoWasmAbi for GenericEnum where GenericEnum: _serde::Serialize, { #[inline] fn none() -> Self::Abi { ::none() } } impl From> for JsValue where GenericEnum: _serde::Serialize, { #[inline] fn from(value: GenericEnum) -> Self { match value.into_js() { Ok(js) => js.into(), Err(err) => { let loc = core::panic::Location::caller(); let msg = { let res = ::alloc::fmt::format( format_args!( "(Converting type failed) {0} ({1}:{2}:{3})", err, loc .file(), loc.line(), loc.column(), ), ); res }; { #[cold] #[track_caller] #[inline(never)] #[rustc_const_panic_str] #[rustc_do_not_const_check] const fn panic_cold_display( arg: &T, ) -> ! { ::core::panicking::panic_display(arg) } panic_cold_display(&msg); }; } } } } impl VectorIntoWasmAbi for GenericEnum where GenericEnum: _serde::Serialize, { type Abi = ::Abi; #[inline] fn vector_into_abi(vector: Box<[Self]>) -> Self::Abi { let values = vector .iter() .map(|value| match value.into_js() { Ok(js) => js.into(), Err(err) => { let loc = core::panic::Location::caller(); let msg = { let res = ::alloc::fmt::format( format_args!( "(Converting type failed) {0} ({1}:{2}:{3})", err, loc .file(), loc.line(), loc.column(), ), ); res }; { #[cold] #[track_caller] #[inline(never)] #[rustc_const_panic_str] #[rustc_do_not_const_check] const fn panic_cold_display( arg: &T, ) -> ! { ::core::panicking::panic_display(arg) } panic_cold_display(&msg); }; } }) .collect(); JsValue::vector_into_abi(values) } } impl FromWasmAbi for GenericEnum where Self: _serde::de::DeserializeOwned, { type Abi = ::Abi; #[inline] unsafe fn from_abi(js: Self::Abi) -> Self { let result = Self::from_js(&JsType::from_abi(js)); if let Err(err) = result { wasm_bindgen::throw_str(err.to_string().as_ref()); } result.unwrap_throw() } } impl OptionFromWasmAbi for GenericEnum where Self: _serde::de::DeserializeOwned, { #[inline] fn is_none(js: &Self::Abi) -> bool { ::is_none(js) } } pub struct SelfOwner(T); impl ::core::ops::Deref for SelfOwner { type Target = T; fn deref(&self) -> &Self::Target { &self.0 } } impl RefFromWasmAbi for GenericEnum where Self: _serde::de::DeserializeOwned, { type Abi = ::Abi; type Anchor = SelfOwner; unsafe fn ref_from_abi(js: Self::Abi) -> Self::Anchor { let result = Self::from_js(&*JsType::ref_from_abi(js)); if let Err(err) = result { wasm_bindgen::throw_str(err.to_string().as_ref()); } SelfOwner(result.unwrap_throw()) } } impl VectorFromWasmAbi for GenericEnum where Self: _serde::de::DeserializeOwned, { type Abi = ::Abi; #[inline] unsafe fn vector_from_abi(js: Self::Abi) -> Box<[Self]> { JsValue::vector_from_abi(js) .into_iter() .map(|value| { let result = Self::from_js(value); if let Err(err) = result { wasm_bindgen::throw_str(err.to_string().as_ref()); } result.unwrap_throw() }) .collect() } } };