{{/*
// Copyright 2025 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
*/}}
{{define "StructDeclaration" -}}
@dataclass
class {{ .PythonName }}:
    {{- if .DocComments }}
    """
    {{- range .DocComments }}
{{ . | escapeQuotes | trimSpace | indentNonEmpty4 }}
    {{- end }}
    """
    {{- end }}
    {{- range .PythonMembers }}
    {{- if .DocComments }}
    """
    {{- range .DocComments }}
{{ . | escapeQuotes | trimSpace | indentNonEmpty4 }}
    {{- end }}
    """
    {{- end }}
    {{ .PythonName }}: {{ .PythonType.PythonName }}
    {{- end }}

    __fidl_kind__ = "struct"
    __fidl_type__ = "{{ .PythonName }}"
    __fidl_raw_type__ = "{{ .Name }}"

    # TODO(https://fxbug.dev/394421154): We should probably remove this method when we
    # start making breaking changes.
    def __getitem__(self, item: str): # type: ignore
        if not isinstance(item, str):
            raise TypeError("Subscripted item must be a string")
        return getattr(self, item)

    def encode(self) -> tuple[bytes, list[typing.Any]]:
        return fidl.encode_struct(self, type(self)._encode, {{ .TypeShapeV2.InlineSize }})

    @classmethod
    def decode(cls, data: bytes, handles: list[typing.Any]) -> typing.Self:
        return fidl.decode_struct(data, handles, cls._decode, {{ .TypeShapeV2.InlineSize }})

    def _encode(self, encoder: fidl.Encoder, _offset: int) -> None:
        {{- if .PythonMembers }}
        {{- range .PythonMembers }}
{{ .EncoderCall | indentNonEmpty8 }}
        {{- end }}
        {{- else }}
        pass
        {{- end }}

    @classmethod
    def _decode(cls, decoder: fidl.Decoder, _offset: int) -> typing.Self:
        {{- if .PythonMembers }}
        {{- range .PythonMembers }}
        {{ .PythonName }} = {{ .DecoderCall }}
        {{- end }}
        return cls(
            {{- range .PythonMembers }}
            {{ .PythonName }}={{ .PythonName }},
            {{- end }}
        )
        {{- else }}
        return cls()
        {{- end }}

    # TODO(https://fxbug.dev/394421154): Assigning None (incorrectly) to each type is a consequence
    # of needing to support creation of a "default object" before decoding.
    @classmethod
    def make_default(cls) -> typing.Self:
        return cls(**{
            {{- range .PythonMembers }}
            "{{ .PythonName }}": None,  # type: ignore[arg-type,unused-ignore]
            {{- end }}
        })


{{ end }}