openharmony_ability_derive/
lib.rs

1use 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 super::*;
16            use openharmony_ability::napi as napi_ohos;
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(
38                env: &openharmony_ability::napi::Env,
39                slot: openharmony_ability::arkui::ArkUIHandle,
40            ) -> openharmony_ability::napi::Result<()> {
41                let root = openharmony_ability::render(env, slot, (*APP).clone())?;
42                ROOT_NODE.replace(Some(root));
43                Ok(())
44            }
45        }
46    };
47
48    f.into()
49}