alef 0.19.21

Opinionated polyglot binding generator for Rust libraries
Documentation
    fn {{ method_name }}({{ signature }}) -> {{ return_type }} {
        let has_method = self.obj.has_named_property("{{ js_method_name }}").unwrap_or(false);
        if !has_method {
            return {{ return_type }}::Continue;
        }

        let func: napi::bindgen_prelude::Function<{{ args_tuple_ty }}, napi::bindgen_prelude::Unknown> = match self.obj.get_named_property("{{ js_method_name }}") {
            Ok(f) => f,
            Err(_) => return {{ return_type }}::Continue,
        };

{% if empty_args %}
        let result = func.call(());
{% else %}
        let __env = self.env();
{% 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(_) => {{ return_type }}::Continue,
            Ok(val) => {
                if val.get_type().ok() == Some(napi::bindgen_prelude::ValueType::Object) {
                    if let Ok(obj) = val.coerce_to_object() {
                        if let Ok(cv) = obj.get_named_property::<napi::bindgen_prelude::Unknown>("custom") {
                            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 }}::Custom(s);
                                }
                            }
                        }
                        if let Ok(ev) = obj.get_named_property::<napi::bindgen_prelude::Unknown>("error") {
                            if !matches!(ev.get_type().unwrap_or(napi::bindgen_prelude::ValueType::Undefined), napi::bindgen_prelude::ValueType::Undefined | napi::bindgen_prelude::ValueType::Null) {
                                if let Ok(s) = ev.coerce_to_string().and_then(|s| s.into_utf8()).and_then(|s| s.into_owned()) {
                                    return {{ return_type }}::Error(s);
                                }
                            }
                        }
                    }
                }
                if let Ok(s) = val.coerce_to_string().and_then(|s| s.into_utf8()).and_then(|s| s.into_owned()) {
                    match s.to_lowercase().as_str() {
                        "continue" => {{ return_type }}::Continue,
                        "skip" => {{ return_type }}::Skip,
                        "preserve_html" | "preservehtml" => {{ return_type }}::PreserveHtml,
                        _ => {{ return_type }}::Custom(s),
                    }
                } else {
                    {{ return_type }}::Continue
                }
            }
        }
    }