{{ self::kdoc_block(doc, "") }}sealed class {{ class_name }}{% if is_error %} : Exception(){% endif %} {
{%- for variant in variants %}
{{ self::kdoc_block(variant.doc, " ") }}{%- if variant.fields.is_empty() %}
data object {{ variant.name }} : {{ class_name }}()
{%- else %}
data class {{ variant.name }}({% for field in variant.fields %}val {{ field.name }}: {{ field.kotlin_type }}{% if !loop.last %}, {% endif %}{% endfor %}) : {{ class_name }}()
{%- endif %}
{%- endfor %}
companion object {
fun decode(reader: WireReader): {{ class_name }} {
val tag = reader.readI32()
return when (tag) {
{%- for variant in variants %}
{{ variant.tag }} -> {
{%- if variant.fields.is_empty() %}
{{ variant.name }}
{%- else %}
{{ variant.name }}(
{%- for field in variant.fields %}
{{ field.wire_decode_expr }}{% if !loop.last %},{% endif %}
{%- endfor %}
)
{%- endif %}
}
{%- endfor %}
else -> throw FfiException(-1, "Unknown {{ class_name }} tag: $tag")
}
}
}
fun wireEncodedSize(): Int = 4 + when (this) {
{%- for variant in variants %}
{%- if variant.fields.is_empty() %}
is {{ variant.name }} -> 0
{%- else %}
is {{ variant.name }} -> {% for field in variant.fields %}{{ field.wire_size_expr }}{% if !loop.last %} + {% endif %}{% endfor %}
{%- endif %}
{%- endfor %}
}
fun wireEncodeTo(wire: WireWriter) {
when (this) {
{%- for variant in variants %}
{%- if variant.fields.is_empty() %}
is {{ variant.name }} -> wire.writeI32({{ variant.tag }})
{%- else %}
is {{ variant.name }} -> {
wire.writeI32({{ variant.tag }})
{%- for field in variant.fields %}
{{ field.wire_encode }}
{%- endfor %}
}
{%- endif %}
{%- endfor %}
}
}
}