// Code generated by fidlgen; DO NOT EDIT.

package enum

import (
	_bindings "syscall/zx/fidl"
)

var _ _bindings.Enum = MyStrictEnum(0)

type MyStrictEnum uint32

const (
	MyStrictEnumFoo MyStrictEnum = 1
	MyStrictEnumBar MyStrictEnum = 2
)

func (_ MyStrictEnum) I_EnumValues() []MyStrictEnum {
	return []MyStrictEnum{
		MyStrictEnumFoo,
		MyStrictEnumBar,
	}
}

func (_ MyStrictEnum) I_EnumIsStrict() bool {
	return true
}

func (x MyStrictEnum) IsUnknown() bool {
	switch x {
	case 1:
		return true
	case 2:
		return true
	default:
		return false
	}
}

func (x MyStrictEnum) String() string {
	switch x {
	case 1:
		return "Foo"
	case 2:
		return "Bar"
	}
	return "Unknown"
}

var _ _bindings.Enum = MyFlexibleEnum(0)

type MyFlexibleEnum uint32

const (
	MyFlexibleEnumFoo MyFlexibleEnum = 1
	MyFlexibleEnumBar MyFlexibleEnum = 2

	// MyFlexibleEnum_Unknown is the default unknown placeholder.
	MyFlexibleEnum_Unknown MyFlexibleEnum = 0xffffffff
)

func (_ MyFlexibleEnum) I_EnumValues() []MyFlexibleEnum {
	return []MyFlexibleEnum{
		MyFlexibleEnumFoo,
		MyFlexibleEnumBar,
	}
}

func (_ MyFlexibleEnum) I_EnumIsStrict() bool {
	return false
}

func (x MyFlexibleEnum) IsUnknown() bool {
	switch x {
	case 1:
		return true
	case 2:
		return true
	default:
		return false
	}
}

func (x MyFlexibleEnum) String() string {
	switch x {
	case 1:
		return "Foo"
	case 2:
		return "Bar"
	}
	return "Unknown"
}

var _ _bindings.Enum = MyFlexibleEnumWithCustomUnknown(0)

type MyFlexibleEnumWithCustomUnknown uint32

const (
	MyFlexibleEnumWithCustomUnknownFoo           MyFlexibleEnumWithCustomUnknown = 1
	MyFlexibleEnumWithCustomUnknownBar           MyFlexibleEnumWithCustomUnknown = 2
	MyFlexibleEnumWithCustomUnknownCustomUnknown MyFlexibleEnumWithCustomUnknown = 3

	// MyFlexibleEnumWithCustomUnknown_Unknown is the default unknown placeholder.
	MyFlexibleEnumWithCustomUnknown_Unknown MyFlexibleEnumWithCustomUnknown = 0x3
)

func (_ MyFlexibleEnumWithCustomUnknown) I_EnumValues() []MyFlexibleEnumWithCustomUnknown {
	return []MyFlexibleEnumWithCustomUnknown{
		MyFlexibleEnumWithCustomUnknownFoo,
		MyFlexibleEnumWithCustomUnknownBar,
		MyFlexibleEnumWithCustomUnknownCustomUnknown,
	}
}

func (_ MyFlexibleEnumWithCustomUnknown) I_EnumIsStrict() bool {
	return false
}

func (x MyFlexibleEnumWithCustomUnknown) IsUnknown() bool {
	switch x {
	case 1:
		return true
	case 2:
		return true
	default:
		return false
	}
}

func (x MyFlexibleEnumWithCustomUnknown) String() string {
	switch x {
	case 1:
		return "Foo"
	case 2:
		return "Bar"
	case 3:
		return "CustomUnknown"
	}
	return "Unknown"
}
