// Auto-generated by BoltFFI. Do not edit.
package {{ package_name }};
{% if !record.uses_native_record_syntax() %}
import java.util.Objects;
{% endif %}
{% if record.uses_native_record_syntax() %}
public record {{ record.class_name }}({% for field in record.fields %}{{ field.java_type }} {{ field.name }}{% if !loop.last %}, {% endif %}{% endfor %}) {
{% else %}
public final class {{ record.class_name }} {
{%- for field in record.fields %}
    public final {{ field.java_type }} {{ field.name }};
{%- endfor %}

    public {{ record.class_name }}({% for field in record.fields %}{{ field.java_type }} {{ field.name }}{% if !loop.last %}, {% endif %}{% endfor %}) {
{%- for field in record.fields %}
        this.{{ field.name }} = {{ field.name }};
{%- endfor %}
    }

{%- for field in record.fields %}
    public {{ field.java_type }} {{ field.name }}() {
        return {{ field.name }};
    }

{%- endfor %}
{% endif %}

    static {{ record.class_name }} decode(WireReader reader) {
        return new {{ record.class_name }}(
{%- for field in record.fields %}
            {{ field.wire_decode_expr }}{% if !loop.last %},{% endif %}
{%- endfor %}
        );
    }

    int wireEncodedSize() {
{%- if record.is_empty() %}
        return 0;
{%- else %}
        return {% for field in record.fields %}{{ field.wire_size_expr }}{% if !loop.last %} + {% endif %}{% endfor %};
{%- endif %}
    }

    void wireEncodeTo(WireWriter wire) {
{%- for field in record.fields %}
        {{ field.wire_encode_expr }};
{%- endfor %}
    }

{% if !record.uses_native_record_syntax() %}
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        {{ record.class_name }} other = ({{ record.class_name }}) obj;
{%- if record.is_empty() %}
        return true;
{%- else %}
        return {% for field in record.fields %}{{ field.equals_expr }}{% if !loop.last %} && {% endif %}{% endfor %};
{%- endif %}
    }

    @Override
    public int hashCode() {
{%- if record.is_empty() %}
        return 1;
{%- else %}
        int result = 1;
{%- for field in record.fields %}
        result = 31 * result + {{ field.hash_expr }};
{%- endfor %}
        return result;
{%- endif %}
    }

    @Override
    public String toString() {
{%- if record.is_empty() %}
        return "{{ record.class_name }}{}";
{%- else %}
        return "{{ record.class_name }}{" +
{%- for field in record.fields %}
            "{% if loop.first %}{% else %}, {% endif %}{{ field.name }}=" + {{ field.name }}{% if !loop.last %} +{% else %} +{% endif %}
{%- endfor %}
            '}';
{%- endif %}
    }
{% endif %}
}
