/// Convert a `{{ rust_path }}` error to a JS `Error` with `code`, `kind`, status and retry properties.
#[allow(dead_code)]
fn {{ fn_name }}(e: {{ rust_path }}) -> wasm_bindgen::JsValue {
let code = {{ code_fn_name }}(&e);
let (kind, error_code): (&str, u32) = match &e {
{% for pattern, kind, code in kind_arms %}
{{ pattern }} => ("{{ kind }}", {{ code }}),
{% endfor %}
#[allow(unreachable_patterns)]
_ => ("Unknown", {{ unknown_code }}),
};
let message = e.to_string();
let obj = js_sys::Error::new(&message);
js_sys::Reflect::set(&obj, &"code".into(), &code.into()).ok();
{% for name, value in properties %}
js_sys::Reflect::set(&obj, &"{{ name }}".into(), &{{ value }}).ok();
{% endfor %}
{% if payload_variants %}
let __alef_error_payload = js_sys::Object::create(&wasm_bindgen::JsValue::NULL.into());
{% if payload_variants | length == 1 %}
if let {{ payload_variants[0][0] }} = &e {
{% for field in payload_variants[0][1] %}
let {{ field.value }} = serde_wasm_bindgen::to_value({{ field.binding }})
.unwrap_or(wasm_bindgen::JsValue::NULL);
js_sys::Reflect::set(&__alef_error_payload, &"{{ field.name }}".into(), &{{ field.value }}).ok();
{% if field.expose_flat %}
js_sys::Reflect::set(&obj, &"{{ field.name }}".into(), &{{ field.value }}).ok();
{% endif %}
{% endfor %}
}
{% else %}
match &e {
{% for pattern, fields in payload_variants %}
{{ pattern }} => {
{% for field in fields %}
let {{ field.value }} = serde_wasm_bindgen::to_value({{ field.binding }})
.unwrap_or(wasm_bindgen::JsValue::NULL);
js_sys::Reflect::set(&__alef_error_payload, &"{{ field.name }}".into(), &{{ field.value }}).ok();
{% if field.expose_flat %}
js_sys::Reflect::set(&obj, &"{{ field.name }}".into(), &{{ field.value }}).ok();
{% endif %}
{% endfor %}
},
{% endfor %}
_ => {}
}
{% endif %}
js_sys::Reflect::set(&obj, &js_sys::Symbol::for_("alef.error.payload").into(), &__alef_error_payload).ok();
{% if attach_payload %}
js_sys::Reflect::set(&obj, &"payload".into(), &__alef_error_payload).ok();
{% endif %}
{% endif %}
obj.into()
}