macro_rules! register_provider {
(
$namespace:literal, $function_js_name:literal,
$function_rust_name:ident(
$($argument_name:ident: $argument_type:ty),+
)
) => {
// TODO: error handling
pub fn $function_rust_name<'env>(
env: &'env napi::Env,
extension_context: &bindgen_prelude::Object,
$($argument_name: $argument_type),+
) -> Result<(), napi::Error> {
let vscode_object = super::VscodeContext::vscode(env)?;
let namespace: bindgen_prelude::Object = vscode_object.get_named_property($namespace)?;
let js_register_provider: bindgen_prelude::Function<
bindgen_prelude::FnArgs<($($argument_type,)+)>,
bindgen_prelude::Object,
> = namespace.get_named_property($function_js_name)?;
let subscription = js_register_provider
.apply(namespace, bindgen_prelude::FnArgs::from(($($argument_name,)+)))?;
let mut subscriptions: bindgen_prelude::Array =
extension_context.get_named_property("subscriptions")?;
subscriptions.insert(subscription)?;
Ok(())
}
};
}
pub(crate) use register_provider;