openharmony_ability_derive/
lib.rs1use proc_macro::TokenStream;
2use syn::ItemFn;
3
4#[proc_macro_attribute]
5pub fn ability(_attr: TokenStream, item: TokenStream) -> TokenStream {
6 let ast = syn::parse_macro_input!(item as ItemFn);
7 let fn_name = &ast.sig.ident;
8 let block = &ast.block;
9 let arg = &ast.sig.inputs;
10
11 let f = quote::quote! {
12 pub(crate) fn #fn_name(#arg) #block
13
14 mod openharmony_ability_mod {
15 use openharmony_ability::napi as napi_ohos;
16 use crate::*;
17
18 static APP: std::sync::LazyLock<openharmony_ability::OpenHarmonyApp> =
19 std::sync::LazyLock::new(|| openharmony_ability::OpenHarmonyApp::new());
20
21 thread_local! {
22 pub static ROOT_NODE: std::cell::RefCell<Option<openharmony_ability::arkui::RootNode>> = std::cell::RefCell::new(None);
23 }
24
25 #[openharmony_ability::napi_derive::napi]
26 pub fn init<'a>(
27 env: &'a openharmony_ability::napi::Env,
28 helper: openharmony_ability::ArkTSHelper,
29 ) -> openharmony_ability::napi::Result<openharmony_ability::ApplicationLifecycle<'a>> {
30 let lifecycle_handle =
31 openharmony_ability::create_lifecycle_handle(env, helper, (*APP).clone())?;
32 #fn_name((*APP).clone());
33 Ok(lifecycle_handle)
34 }
35
36 #[openharmony_ability::napi_derive::napi]
37 pub fn render<'a>(
38 env: &'a openharmony_ability::napi::Env,
39 slot: openharmony_ability::arkui::ArkUIHandle,
40 callback: openharmony_ability::napi::bindgen_prelude::Function<'a, (), ()>,
41 ) -> openharmony_ability::napi::Result<openharmony_ability::Render<'a>> {
42 let (root, ret) = openharmony_ability::render(env, slot, callback, (*APP).clone())?;
43 ROOT_NODE.replace(Some(root));
44 Ok(ret)
45 }
46 }
47 };
48
49 f.into()
50}