diff --git a/Cargo.lock b/Cargo.lock index 98b1582478..4b0fbb420c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -517,7 +517,6 @@ name = "boa_macros_tests" version = "0.18.0" dependencies = [ "boa_engine", - "boa_macros", "trybuild", ] diff --git a/Cargo.toml b/Cargo.toml index b8588aee47..1dc833c8b7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,7 +71,7 @@ serde = "1.0.197" static_assertions = "1.1.0" textwrap = "0.16.0" thin-vec = "0.2.13" -time = {version = "0.3.34", no-default-features = true, features = ["local-offset", "large-dates", "wasm-bindgen", "parsing", "formatting", "macros"]} +time = {version = "0.3.34", default-features = false, features = ["local-offset", "large-dates", "wasm-bindgen", "parsing", "formatting", "macros"]} tinystr = "0.7.5" log = "0.4.21" simple_logger = "4.3.3" diff --git a/core/macros/src/lib.rs b/core/macros/src/lib.rs index 2d470044e9..56b19a71e0 100644 --- a/core/macros/src/lib.rs +++ b/core/macros/src/lib.rs @@ -418,30 +418,19 @@ fn generate_conversion(fields: FieldsNamed) -> Result pd.value().ok_or_else(|| ::boa_engine::JsError::from( + ::boa_engine::JsNativeError::typ().with_message(#error_str) + ))?.clone().try_js_into(context)?, + None => ::boa_engine::JsValue::undefined().try_js_into(context)?, + }; + }); + if let Some(method) = from_js_with { let ident = Ident::new(&method.value(), method.span()); final_fields.push(quote! { - let #name = #ident(props.get(&::boa_engine::js_string!(#name_str).into()).ok_or_else(|| { - ::boa_engine::JsError::from( - boa_engine::JsNativeError::typ().with_message(#error_str) - ) - })?.value().ok_or_else(|| { - ::boa_engine::JsError::from( - boa_engine::JsNativeError::typ().with_message(#error_str) - ) - })?, context)?; - }); - } else { - final_fields.push(quote! { - let #name = props.get(&::boa_engine::js_string!(#name_str).into()).ok_or_else(|| { - ::boa_engine::JsError::from( - boa_engine::JsNativeError::typ().with_message(#error_str) - ) - })?.value().ok_or_else(|| { - ::boa_engine::JsError::from( - boa_engine::JsNativeError::typ().with_message(#error_str) - ) - })?.clone().try_js_into(context)?; + let #name = #ident(&#name, context)?; }); } } diff --git a/tests/macros/Cargo.toml b/tests/macros/Cargo.toml index a63d5f97cd..d9dd11b9e0 100644 --- a/tests/macros/Cargo.toml +++ b/tests/macros/Cargo.toml @@ -12,7 +12,6 @@ rust-version.workspace = true [dev-dependencies] trybuild = "1.0.90" -boa_macros.workspace = true boa_engine.workspace = true [lints] diff --git a/tests/macros/tests/tests.rs b/tests/macros/tests/derive.rs similarity index 100% rename from tests/macros/tests/tests.rs rename to tests/macros/tests/derive.rs diff --git a/tests/macros/tests/optional.rs b/tests/macros/tests/optional.rs new file mode 100644 index 0000000000..8c1b4ab0bc --- /dev/null +++ b/tests/macros/tests/optional.rs @@ -0,0 +1,67 @@ +#![allow(unused_crate_dependencies)] + +use boa_engine::value::TryFromJs; +use boa_engine::Source; + +#[derive(PartialEq, Eq, TryFromJs)] +struct Deserialize { + required: String, + optional: Option, +} + +#[test] +fn optional_missing_try_from_js() { + let mut context = boa_engine::Context::default(); + let value = context + .eval(Source::from_bytes( + r#" + let empty = { + "required":"foo", + }; + empty + "#, + )) + .unwrap(); + + let deserialized: Deserialize = Deserialize::try_from_js(&value, &mut context).unwrap(); + assert_eq!(deserialized.required, "foo"); + assert_eq!(deserialized.optional, None); +} + +#[test] +fn optional_try_from_js() { + let mut context = boa_engine::Context::default(); + let value = context + .eval(Source::from_bytes( + r#" + let empty = { + "required": "foo", + "optional": "bar", + }; + empty + "#, + )) + .unwrap(); + + let deserialized: Deserialize = Deserialize::try_from_js(&value, &mut context).unwrap(); + assert_eq!(deserialized.required, "foo"); + assert_eq!(deserialized.optional, Some("bar".to_string())); +} + +#[test] +fn required_missing_try_from_js() { + let mut context = boa_engine::Context::default(); + let value = context + .eval(Source::from_bytes( + r" + let value = {}; + value + ", + )) + .unwrap(); + + assert!( + Deserialize::try_from_js(&value, &mut context).is_err(), + "foo" + ); +}