[fidl][go] Validate enums in Go bindings

Emitting an `I_EnumValues` method to retrieve all possible values of an
enum when creating a marhsaler.

See I1f7854f6b0eb79f1f26fb6efec581627118cd652 for validation using this
method in the Go FIDL runtime.

Test: fx test fidl_go_conformance
Bug: 8007
Change-Id: Ibf130e8a621bcf5d5391eabee8b4cd46a73ef5cf
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/404855
Reviewed-by: Felix Zhu <fcz@google.com>
Testability-Review: Felix Zhu <fcz@google.com>
Commit-Queue: Pascal Perez <pascallouis@google.com>
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/consts.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/consts.test.json.go.golden
index b7592ff..c840ba3 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/consts.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/consts.test.json.go.golden
@@ -25,6 +25,11 @@
 	EnumTypeValue EnumType = 1
 )
 
+func (_ EnumType) I_EnumValues() []EnumType {
+	return []EnumType{
+		EnumTypeValue,
+	}
+}
 func (x EnumType) String() string {
 	switch x {
 	case 1:
@@ -39,6 +44,11 @@
 	BitsTypeValue BitsType = 1
 )
 
+func (_ BitsType) I_EnumValues() []BitsType {
+	return []BitsType{
+		BitsTypeValue,
+	}
+}
 func (x BitsType) String() string {
 	switch x {
 	case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/doc_comments.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/doc_comments.test.json.go.golden
index 630e83c..da57b09 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/doc_comments.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/doc_comments.test.json.go.golden
@@ -23,6 +23,12 @@
 	MyEnumBar MyEnum = 2
 )
 
+func (_ MyEnum) I_EnumValues() []MyEnum {
+	return []MyEnum{
+		MyEnumFoo,
+		MyEnumBar,
+	}
+}
 func (x MyEnum) String() string {
 	switch x {
 	case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/enum.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/enum.test.json.go.golden
index 22822ad..07f99e0 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/enum.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/enum.test.json.go.golden
@@ -9,6 +9,12 @@
 	MyStrictEnumBar MyStrictEnum = 2
 )
 
+func (_ MyStrictEnum) I_EnumValues() []MyStrictEnum {
+	return []MyStrictEnum{
+		MyStrictEnumFoo,
+		MyStrictEnumBar,
+	}
+}
 func (x MyStrictEnum) String() string {
 	switch x {
 	case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/handles.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/handles.test.json.go.golden
index 1043d18..04f9479 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/handles.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/handles.test.json.go.golden
@@ -42,6 +42,40 @@
 	ObjTypeMsiInterrupt  ObjType = 33
 )
 
+func (_ ObjType) I_EnumValues() []ObjType {
+	return []ObjType{
+		ObjTypeNone,
+		ObjTypeProcess,
+		ObjTypeThread,
+		ObjTypeVmo,
+		ObjTypeChannel,
+		ObjTypeEvent,
+		ObjTypePort,
+		ObjTypeInterrupt,
+		ObjTypePciDevice,
+		ObjTypeLog,
+		ObjTypeSocket,
+		ObjTypeResource,
+		ObjTypeEventpair,
+		ObjTypeJob,
+		ObjTypeVmar,
+		ObjTypeFifo,
+		ObjTypeGuest,
+		ObjTypeVcpu,
+		ObjTypeTimer,
+		ObjTypeIommu,
+		ObjTypeBti,
+		ObjTypeProfile,
+		ObjTypePmt,
+		ObjTypeSuspendToken,
+		ObjTypePager,
+		ObjTypeException,
+		ObjTypeClock,
+		ObjTypeStream,
+		ObjTypeMsiAllocation,
+		ObjTypeMsiInterrupt,
+	}
+}
 func (x ObjType) String() string {
 	switch x {
 	case 0:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/handles_in_types.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/handles_in_types.test.json.go.golden
index 357ee6b..26199f1 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/handles_in_types.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/handles_in_types.test.json.go.golden
@@ -14,6 +14,12 @@
 	ObjTypeVmo  ObjType = 3
 )
 
+func (_ ObjType) I_EnumValues() []ObjType {
+	return []ObjType{
+		ObjTypeNone,
+		ObjTypeVmo,
+	}
+}
 func (x ObjType) String() string {
 	switch x {
 	case 0:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/placement_of_attributes.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/placement_of_attributes.test.json.go.golden
index d04ec46..e0b2d04 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/placement_of_attributes.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/placement_of_attributes.test.json.go.golden
@@ -17,6 +17,11 @@
 	ExampleEnumMember ExampleEnum = 1
 )
 
+func (_ ExampleEnum) I_EnumValues() []ExampleEnum {
+	return []ExampleEnum{
+		ExampleEnumMember,
+	}
+}
 func (x ExampleEnum) String() string {
 	switch x {
 	case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.json.go.golden
index 6682039..e49eb9b 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/protocols.test.json.go.golden
@@ -14,6 +14,12 @@
 	ObjTypeSocket ObjType = 14
 )
 
+func (_ ObjType) I_EnumValues() []ObjType {
+	return []ObjType{
+		ObjTypeNone,
+		ObjTypeSocket,
+	}
+}
 func (x ObjType) String() string {
 	switch x {
 	case 0:
@@ -31,6 +37,12 @@
 	ErrorEnunErrBar ErrorEnun = 2
 )
 
+func (_ ErrorEnun) I_EnumValues() []ErrorEnun {
+	return []ErrorEnun{
+		ErrorEnunErrFoo,
+		ErrorEnunErrBar,
+	}
+}
 func (x ErrorEnun) String() string {
 	switch x {
 	case 1:
diff --git a/garnet/go/src/fidl/compiler/backend/goldens/type_aliases.test.json.go.golden b/garnet/go/src/fidl/compiler/backend/goldens/type_aliases.test.json.go.golden
index 3e9b874..53234f5 100644
--- a/garnet/go/src/fidl/compiler/backend/goldens/type_aliases.test.json.go.golden
+++ b/garnet/go/src/fidl/compiler/backend/goldens/type_aliases.test.json.go.golden
@@ -15,6 +15,12 @@
 	ObjTypeChannel ObjType = 4
 )
 
+func (_ ObjType) I_EnumValues() []ObjType {
+	return []ObjType{
+		ObjTypeNone,
+		ObjTypeChannel,
+	}
+}
 func (x ObjType) String() string {
 	switch x {
 	case 0:
diff --git a/tools/fidl/fidlgen_go/templates/enum.tmpl.go b/tools/fidl/fidlgen_go/templates/enum.tmpl.go
index 9491ee3..6e08cf7 100644
--- a/tools/fidl/fidlgen_go/templates/enum.tmpl.go
+++ b/tools/fidl/fidlgen_go/templates/enum.tmpl.go
@@ -15,6 +15,13 @@
 	{{ $.Name }}{{ .Name }} {{ $.Name }} = {{ .Value }}
 	{{- end }}
 )
+func (_ {{.Name}}) I_EnumValues() []{{.Name}} {
+	return []{{.Name}}{
+		{{- range .Members }}
+		{{ $.Name }}{{ .Name }},
+		{{- end }}
+	}
+}
 func (x {{.Name}}) String() string {
 	switch x {
 	{{- range .Members }}