alef 0.25.37

Opinionated polyglot binding generator for Rust libraries
Documentation
    fn {{ method_name }}({{ signature }}) -> {{ return_type }} {
        // self.env is the napi_env that owned the persistent reference; it is stable for
        // the lifetime of the Node process. Env::from_raw is a safe constructor that
        // gives us a live Env handle for the current scope.
        let __env = napi::Env::from_raw(self.env);
        let obj_ref = match self.obj_ref.as_ref() {
            Some(r) => r,
            None => return {{ default_result_expr }},
        };
        let obj = match obj_ref.get_value(&__env) {
            Ok(o) => o,
            Err(_) => return {{ default_result_expr }},
        };

        // Try to get the JS function from the object
        let func: napi::bindgen_prelude::Function<{{ args_tuple_ty }}, napi::bindgen_prelude::Unknown> = match obj.get_named_property("{{ js_method_name }}") {
            Ok(f) => f,
            Err(_) => return {{ default_result_expr }},
        };

{% if empty_args %}
        let result = func.call(());
{% else %}
{% for arg_expr in arg_exprs %}
        let arg_{{ loop.index0 }}: napi::bindgen_prelude::Unknown = {{ arg_expr }};
{% endfor %}
        let result = func.call(napi::bindgen_prelude::FnArgs::from({{ tuple_args }}));
{% endif %}

        match result {
            Err(_) => {{ default_result_expr }},
            Ok(val) => {
                if val.get_type().ok() == Some(napi::bindgen_prelude::ValueType::Object) {
                    if let Ok(obj) = val.coerce_to_object() {
{%- for variant in payload_result_variants %}
                        let prop_name = match "{{ variant.name }}" {
                            "Custom" => "custom",
                            "Error" => "error",
                            _ => "{{ variant.wire_name }}",
                        };
                        if let Ok(cv) = obj.get_named_property::<napi::bindgen_prelude::Unknown>(prop_name) {
                            if !matches!(cv.get_type().unwrap_or(napi::bindgen_prelude::ValueType::Undefined), napi::bindgen_prelude::ValueType::Undefined | napi::bindgen_prelude::ValueType::Null) {
                                if let Ok(s) = cv.coerce_to_string().and_then(|s| s.into_utf8()).and_then(|s| s.into_owned()) {
                                    return {{ return_type }}::{{ variant.name }}(s);
                                }
                            }
                        }
{%- endfor %}
                    }
                }
                if let Ok(s) = val.coerce_to_string().and_then(|s| s.into_utf8()).and_then(|s| s.into_owned()) {
                    match s.as_str() {
{%- for variant in unit_result_variants %}
                        "{{ variant.wire_name }}" => {{ return_type }}::{{ variant.name }},
{%- endfor %}
                        _ => {{ unknown_string_result_expr }},
                    }
                } else {
                    {{ default_result_expr }}
                }
            }
        }
    }