napi-rs/examples/napi-compat-mode/src/class.rs

76 lines
2.5 KiB
Rust
Raw Normal View History

2020-08-03 00:31:22 +09:00
use std::convert::TryInto;
use napi::{CallContext, JsFunction, JsNumber, JsObject, JsUndefined, Property, Result};
2020-08-03 00:31:22 +09:00
2020-10-15 12:10:17 +09:00
struct NativeClass {
value: i32,
}
2020-08-03 00:31:22 +09:00
#[js_function(1)]
fn create_test_class(ctx: CallContext) -> Result<JsFunction> {
let add_count_method = Property::new("addCount")?.with_method(add_count);
let add_native_count = Property::new("addNativeCount")?.with_method(add_native_count);
let renew_wrapped = Property::new("renewWrapped")?.with_method(renew_wrapped);
2021-09-09 19:57:18 +09:00
ctx.env.define_class(
"TestClass",
test_class_constructor,
&[add_count_method, add_native_count, renew_wrapped],
)
2020-08-03 00:31:22 +09:00
}
#[js_function(1)]
fn test_class_constructor(ctx: CallContext) -> Result<JsUndefined> {
2020-10-15 12:10:17 +09:00
let count: i32 = ctx.get::<JsNumber>(0)?.try_into()?;
let mut this: JsObject = ctx.this_unchecked();
2020-10-15 12:10:17 +09:00
ctx
.env
.wrap(&mut this, NativeClass { value: count + 100 })?;
this.set_named_property("count", ctx.env.create_int32(count)?)?;
2020-08-03 00:31:22 +09:00
ctx.env.get_undefined()
}
#[js_function(1)]
fn add_count(ctx: CallContext) -> Result<JsUndefined> {
2020-08-03 00:31:22 +09:00
let add: i32 = ctx.get::<JsNumber>(0)?.try_into()?;
let mut this: JsObject = ctx.this_unchecked();
let count: i32 = this.get_named_property::<JsNumber>("count")?.try_into()?;
this.set_named_property("count", ctx.env.create_int32(count + add)?)?;
2020-08-03 00:31:22 +09:00
ctx.env.get_undefined()
}
2020-10-15 12:10:17 +09:00
#[js_function(1)]
fn add_native_count(ctx: CallContext) -> Result<JsNumber> {
let add: i32 = ctx.get::<JsNumber>(0)?.try_into()?;
let this: JsObject = ctx.this_unchecked();
2020-10-15 12:10:17 +09:00
let native_class: &mut NativeClass = ctx.env.unwrap(&this)?;
2021-05-28 19:50:16 +09:00
native_class.value += add;
2020-10-15 12:10:17 +09:00
ctx.env.create_int32(native_class.value)
}
2021-09-09 19:57:18 +09:00
#[js_function]
fn renew_wrapped(ctx: CallContext) -> Result<JsUndefined> {
let mut this: JsObject = ctx.this_unchecked();
ctx.env.drop_wrapped::<NativeClass>(&mut this)?;
ctx.env.wrap(&mut this, NativeClass { value: 42 })?;
ctx.env.get_undefined()
}
2020-10-27 15:19:40 +09:00
#[js_function(1)]
fn new_test_class(ctx: CallContext) -> Result<JsObject> {
let add_count_method = Property::new("addCount")?.with_method(add_count);
let add_native_count = Property::new("addNativeCount")?.with_method(add_native_count);
2020-10-27 15:19:40 +09:00
let properties = vec![add_count_method, add_native_count];
let test_class =
ctx
.env
.define_class("TestClass", test_class_constructor, properties.as_slice())?;
2021-05-28 19:50:16 +09:00
test_class.new(&[ctx.env.create_int32(42)?])
2020-10-27 15:19:40 +09:00
}
pub fn register_js(exports: &mut JsObject) -> Result<()> {
exports.create_named_method("createTestClass", create_test_class)?;
exports.create_named_method("newTestClass", new_test_class)?;
Ok(())
}