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;