// Copyright 2018 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.

package codegen

const enumTmpl = `
{{- define "EnumDeclaration" -}}
{{- range .DocComments}}
///{{ . }}
{{- end}}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
{{- if .IsStrict }}
#[repr({{ .Type }})]
{{- else }}
#[non_exhaustive]
{{- end }}
pub enum {{ .Name }} {
	{{- range .Members }}
	{{- range .DocComments }}
	///{{ . }}
	{{- end }}
	{{ .Name }}{{ if $.IsStrict }} = {{ .Value }}{{ end }},
	{{- end }}
	{{- if .IsFlexible }}
	#[deprecated = "Use ` + "`{{ .Name }}::unknown()` to construct and `{{ .Name }}Unknown!()`" + ` to exhaustively match."]
	#[doc(hidden)]
	__Unknown({{ .Type }}),
	{{- end }}
}

{{- if .IsFlexible }}
/// Pattern that matches an unknown {{ .Name }} member.
#[macro_export]
macro_rules! {{ .Name }}Unknown {
	() => { _ };
}
{{- end }}

{{- if .IsStrict }}
fidl_strict_enum! {
	name: {{ .Name }},
	prim_ty: {{ .Type }},
	members: [
		{{- range .Members }}
		{{ .Name }} { value: {{ .Value }}, },
		{{- end }}
	],
}
{{- else }}
fidl_flexible_enum! {
	name: {{ .Name }},
	prim_ty: {{ .Type }},
	members: [
		{{- range .Members }}
		{{ .Name }} { value: {{ .Value }}, },
		{{- end }}
	],
	{{- range .Members }}
	{{- if .IsUnknown }}
	custom_unknown_member: {{ .Name }},
	{{- end }}
	{{- end }}
	unknown_member: __Unknown,
	default_unknown_value: {{ .UnknownValueForTmpl | printf "%#x" }},
}
{{- end }}
{{- end }}
`
