Skip to content

Commit 0f282f5

Browse files
authored
Add support for boa(rename = "") in TryFromJs derive (#3980)
* Add support for boa(rename = "") in TryFromJs derive * Fix clippies and fmt * Move macro test to boa_engine
1 parent eecba59 commit 0f282f5

File tree

2 files changed

+43
-4
lines changed

2 files changed

+43
-4
lines changed

core/engine/tests/macros.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#![allow(unused_crate_dependencies)]
2+
use boa_engine::value::TryFromJs;
3+
use boa_engine::{js_string, Context, JsResult, JsValue, Source};
4+
use boa_string::JsString;
5+
6+
#[test]
7+
fn try_from_js_derive() {
8+
#[derive(Debug, TryFromJs, Eq, PartialEq)]
9+
struct TryFromJsTest {
10+
a: JsString,
11+
#[boa(rename = "bBB")]
12+
b: i32,
13+
#[boa(from_js_with = "check_tfj_called")]
14+
c: i32,
15+
}
16+
17+
fn check_tfj_called(value: &JsValue, context: &mut Context) -> JsResult<i32> {
18+
let v = value.to_i32(context)?;
19+
Ok(v / 2)
20+
}
21+
22+
let mut context = Context::default();
23+
let obj = context
24+
.eval(Source::from_bytes(br#"({ a: "hello", bBB: 42, c: 120 })"#))
25+
.unwrap();
26+
27+
let result = TryFromJsTest::try_from_js(&obj, &mut context).unwrap();
28+
assert_eq!(
29+
result,
30+
TryFromJsTest {
31+
a: js_string!("hello"),
32+
b: 42,
33+
c: 60
34+
}
35+
);
36+
}

core/macros/src/lib.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -433,12 +433,10 @@ fn generate_conversion(fields: FieldsNamed) -> Result<proc_macro2::TokenStream,
433433
)]
434434
})?;
435435

436-
let name_str = format!("{name}");
437436
field_list.push(name.clone());
438437

439-
let error_str = format!("cannot get property {name_str} of value");
440-
441438
let mut from_js_with = None;
439+
let mut field_name = format!("{name}");
442440
if let Some(attr) = field
443441
.attrs
444442
.into_iter()
@@ -449,6 +447,10 @@ fn generate_conversion(fields: FieldsNamed) -> Result<proc_macro2::TokenStream,
449447
let value = meta.value()?;
450448
from_js_with = Some(value.parse::<LitStr>()?);
451449
Ok(())
450+
} else if meta.path.is_ident("rename") {
451+
let value = meta.value()?;
452+
field_name = value.parse::<LitStr>()?.value();
453+
Ok(())
452454
} else {
453455
Err(meta.error(
454456
"invalid syntax in the `#[boa()]` attribute. \
@@ -460,8 +462,9 @@ fn generate_conversion(fields: FieldsNamed) -> Result<proc_macro2::TokenStream,
460462
.map_err(|err| vec![err])?;
461463
}
462464

465+
let error_str = format!("cannot get property {name} of value");
463466
final_fields.push(quote! {
464-
let #name = match props.get(&::boa_engine::js_string!(#name_str).into()) {
467+
let #name = match props.get(&::boa_engine::js_string!(#field_name).into()) {
465468
Some(pd) => pd.value().ok_or_else(|| ::boa_engine::JsError::from(
466469
::boa_engine::JsNativeError::typ().with_message(#error_str)
467470
))?.clone().try_js_into(context)?,

0 commit comments

Comments
 (0)