{{with .Annotations.Doc -}}
// {{.}}
{{end -}}
type {{.Node.Name}} uint16

{{ template "_typeid" .Node }}

{{with .EnumValues -}}
// Values of {{$.Node.Name}}.
const (
{{range . -}}
{{.FullName}} {{$.Node.Name}} = {{.Val}}
{{end}}
)

// String returns the enum's constant name.
func (c {{$.Node.Name}}) String() string {
	switch c {
	{{range . -}}
        {{if .Tag}}case {{.FullName}}: return {{printf "%q" .Tag}}
	{{end}}
        {{- end}}
	default: return ""
	}
}

// {{$.Node.Name}}FromString returns the enum value with a name,
// or the zero value if there's no such value.
func {{$.Node.Name}}FromString(c string) {{$.Node.Name}} {
	switch c {
	{{range . -}}
        {{if .Tag}}case {{printf "%q" .Tag}}: return {{.FullName}}
	{{end}}
        {{- end}}
	default: return 0
	}
}
{{end}}

type {{.Node.Name}}_List struct { {{$.G.Capnp}}.List }

func New{{.Node.Name}}_List(s *{{$.G.Capnp}}.Segment, sz int32) ({{.Node.Name}}_List, error) {
	l, err := {{.G.Capnp}}.NewUInt16List(s, sz)
	return {{.Node.Name}}_List{l.List}, err
}

func (l {{.Node.Name}}_List) At(i int) {{.Node.Name}} {
	ul := {{.G.Capnp}}.UInt16List{List: l.List}
	return {{.Node.Name}}(ul.At(i))
}

func (l {{.Node.Name}}_List) Set(i int, v {{.Node.Name}}) {
	ul := {{.G.Capnp}}.UInt16List{List: l.List}
	ul.Set(i, uint16(v))
}
