/**
 * JSON dispatch wrapper for [I{{ trait_name }}] implementations, called from the
 * native trait bridge. Decodes each trait call's arguments, invokes the typed
 * implementation (bridging suspend methods via runBlocking), and encodes the
 * result as {"ok": ...} on success or {"err": "..."} on failure.
 */
internal class {{ trait_name }}JniDispatcher(private val impl: I{{ trait_name }}) {
    private val mapper = jacksonObjectMapper()

    /** JSON array of the Rust-side names of the methods this host provides. */
    fun implementedMethods(): String =
        mapper.writeValueAsString(
            listOf(
{% for name in implemented %}
                "{{ name }}",
{% endfor %}
            ),
        )

    @Suppress("UNUSED_PARAMETER", "CyclomaticComplexMethod")
    fun dispatch(method: String, argsJson: String): String =
        try {
            val args = mapper.readTree(argsJson)
            val result: Any? =
                when (method) {
{% for m in methods %}
                    "{{ m.rust_name }}" -> {{ m.call_expr }}
{% endfor %}
{% if has_super_trait %}
                    "name" -> impl.name()
                    "version" -> impl.version()
                    "initialize" -> {
                        impl.initialize()
                        null
                    }
                    "shutdown" -> {
                        impl.shutdown()
                        null
                    }
{% endif %}
                    else -> throw IllegalArgumentException("unknown trait method: $method")
                }
            mapper.writeValueAsString(mapOf("ok" to result))
        } catch (t: Throwable) {
            mapper.writeValueAsString(mapOf("err" to (t.message ?: t.toString())))
        }
}
