macro_rules! namespace_function {
    (
        $namespace:literal {
            $(
                $function_js_name:literal: $function_rust_name:ident(
                    $(
                        $argument_name:ident: $argument_type:ty,
                    )*
                ) -> $return_type:ty;
            )*
        }
    ) => {
        $(
            pub fn $function_rust_name<'env>(
                env: &napi::Env,
                $($argument_name: $argument_type),*
            ) -> Result<$return_type, napi::Error> {
                let vscode_object = super::VscodeContext::vscode(env)?;
                let namespace: bindgen_prelude::Object = vscode_object.get_named_property($namespace)?;

                let function_prototype: bindgen_prelude::Function<
                    bindgen_prelude::FnArgs<($($argument_type,)*)>,
                    $return_type,
                > = namespace.get_named_property($function_js_name)?;

                function_prototype.apply(
                    namespace,
                    bindgen_prelude::FnArgs::from(($($argument_name,)*)),
                )
            }
        )*
    };
}

pub(crate) use namespace_function;