diff --git a/tests-e2e/test3/Cargo.toml b/tests-e2e/test3/Cargo.toml new file mode 100644 index 0000000..1f7ef1b --- /dev/null +++ b/tests-e2e/test3/Cargo.toml @@ -0,0 +1,21 @@ +[package] +name = "test3" +publish = false +version = "0.1.0" +edition = "2021" + +[dependencies] +wasm-bindgen = "0.2" +tsify-next = { path = "../..", version = "*" } +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" + +[dev-dependencies] +wasm-bindgen-test = "0.3" + +[lib] +path = "entry_point.rs" +crate-type = ["cdylib"] + +[build-dependencies] +wasm-bindgen-cli = "0.2" diff --git a/tests-e2e/test3/entry_point.rs b/tests-e2e/test3/entry_point.rs new file mode 100644 index 0000000..b07285a --- /dev/null +++ b/tests-e2e/test3/entry_point.rs @@ -0,0 +1,10 @@ +use serde::Serialize; +use tsify_next::Tsify; +use wasm_bindgen::prelude::*; + +#[derive(Serialize, Tsify)] +#[tsify(into_wasm_abi)] +pub struct Identified { + pub id: Id, + pub value: Value, +} diff --git a/tests/expand/borrow.expanded.rs b/tests/expand/borrow.expanded.rs index d984be0..acf1b78 100644 --- a/tests/expand/borrow.expanded.rs +++ b/tests/expand/borrow.expanded.rs @@ -204,7 +204,10 @@ const _: () = { ::none() } } - impl<'a> From> for JsValue { + impl<'a> From> for JsValue + where + Borrow<'a>: _serde::Serialize, + { #[inline] fn from(value: Borrow<'a>) -> Self { value.into_js().unwrap_throw().into() diff --git a/tests/expand/generic_enum.expanded.rs b/tests/expand/generic_enum.expanded.rs index 3d7db09..9d3c487 100644 --- a/tests/expand/generic_enum.expanded.rs +++ b/tests/expand/generic_enum.expanded.rs @@ -210,7 +210,10 @@ const _: () = { ::none() } } - impl From> for JsValue { + impl From> for JsValue + where + GenericEnum: _serde::Serialize, + { #[inline] fn from(value: GenericEnum) -> Self { value.into_js().unwrap_throw().into() diff --git a/tests/expand/generic_struct.expanded.rs b/tests/expand/generic_struct.expanded.rs index 493e6a1..6f27b0a 100644 --- a/tests/expand/generic_struct.expanded.rs +++ b/tests/expand/generic_struct.expanded.rs @@ -209,7 +209,10 @@ const _: () = { ::none() } } - impl From> for JsValue { + impl From> for JsValue + where + GenericStruct: _serde::Serialize, + { #[inline] fn from(value: GenericStruct) -> Self { value.into_js().unwrap_throw().into() @@ -465,7 +468,10 @@ const _: () = { ::none() } } - impl From> for JsValue { + impl From> for JsValue + where + GenericNewtype: _serde::Serialize, + { #[inline] fn from(value: GenericNewtype) -> Self { value.into_js().unwrap_throw().into() diff --git a/tsify-next-macros/src/wasm_bindgen.rs b/tsify-next-macros/src/wasm_bindgen.rs index 0b0baab..4e97932 100644 --- a/tsify-next-macros/src/wasm_bindgen.rs +++ b/tsify-next-macros/src/wasm_bindgen.rs @@ -1,6 +1,6 @@ use proc_macro2::TokenStream; use quote::quote; -use syn::parse_quote; +use syn::{parse_quote, WhereClause}; use crate::{container::Container, decl::Decl}; @@ -94,6 +94,11 @@ fn expand_into_wasm_abi(cont: &Container) -> TokenStream { let (impl_generics, ty_generics, where_clause) = generics.split_for_impl(); + let serde_where_clause = WhereClause { + where_token: parse_quote!(where), + predicates: parse_quote!(#ident #ty_generics: #serde_path::Serialize), + }; + quote! { impl #impl_generics IntoWasmAbi for #ident #ty_generics #where_clause { type Abi = ::Abi; @@ -111,7 +116,7 @@ fn expand_into_wasm_abi(cont: &Container) -> TokenStream { } } - impl #impl_generics From<#ident #ty_generics> for JsValue { + impl #impl_generics From<#ident #ty_generics> for JsValue #serde_where_clause { #[inline] fn from(value: #ident #ty_generics) -> Self { value.into_js().unwrap_throw().into()