// Code generated by fidlgen; DO NOT EDIT.

package union

import (
	_bindings "syscall/zx/fidl"
)

type Pizza struct {
	_        struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	Toppings []string `fidl_offset_v1:"0" fidl_bounds:",16"`
}

var _mPizza = _bindings.CreateLazyMarshaler(Pizza{})

func (msg *Pizza) Marshaler() _bindings.Marshaler {
	return _mPizza
}

type Pasta struct {
	_     struct{} `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	Sauce string   `fidl_offset_v1:"0" fidl_bounds:"16"`
}

var _mPasta = _bindings.CreateLazyMarshaler(Pasta{})

func (msg *Pasta) Marshaler() _bindings.Marshaler {
	return _mPasta
}

type NullableUnionStruct struct {
	_        struct{} `fidl:"s" fidl_size_v1:"24" fidl_alignment_v1:"8"`
	TheUnion *Union   `fidl_offset_v1:"0"`
}

var _mNullableUnionStruct = _bindings.CreateLazyMarshaler(NullableUnionStruct{})

func (msg *NullableUnionStruct) Marshaler() _bindings.Marshaler {
	return _mNullableUnionStruct
}

type Empty struct {
	_ struct{} `fidl:"s" fidl_size_v1:"1" fidl_alignment_v1:"1"`
}

var _mEmpty = _bindings.CreateLazyMarshaler(Empty{})

func (msg *Empty) Marshaler() _bindings.Marshaler {
	return _mEmpty
}

type StructWithNullableXUnion struct {
	_  struct{}          `fidl:"s" fidl_size_v1:"24" fidl_alignment_v1:"8"`
	X1 *OlderSimpleUnion `fidl_offset_v1:"0"`
}

var _mStructWithNullableXUnion = _bindings.CreateLazyMarshaler(StructWithNullableXUnion{})

func (msg *StructWithNullableXUnion) Marshaler() _bindings.Marshaler {
	return _mStructWithNullableXUnion
}

type testProtocolWithCtxStrictXUnionHenceResponseMayBeStackAllocatedResponse struct {
	_  struct{}            `fidl:"s" fidl_size_v1:"24" fidl_alignment_v1:"8"`
	Xu StrictBoundedXUnion `fidl_offset_v1:"0"`
}

var _mtestProtocolWithCtxStrictXUnionHenceResponseMayBeStackAllocatedResponse = _bindings.CreateLazyMarshaler(testProtocolWithCtxStrictXUnionHenceResponseMayBeStackAllocatedResponse{})

func (msg *testProtocolWithCtxStrictXUnionHenceResponseMayBeStackAllocatedResponse) Marshaler() _bindings.Marshaler {
	return _mtestProtocolWithCtxStrictXUnionHenceResponseMayBeStackAllocatedResponse
}

type testProtocolWithCtxFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse struct {
	_  struct{}         `fidl:"s" fidl_size_v1:"24" fidl_alignment_v1:"8"`
	Xu OlderSimpleUnion `fidl_offset_v1:"0"`
}

var _mtestProtocolWithCtxFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse = _bindings.CreateLazyMarshaler(testProtocolWithCtxFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse{})

func (msg *testProtocolWithCtxFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse) Marshaler() _bindings.Marshaler {
	return _mtestProtocolWithCtxFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse
}

type I_pizzaOrPastaTag uint64

const (
	PizzaOrPastaPizza = 1 // 0x00000001
	PizzaOrPastaPasta = 2 // 0x00000002
)

type PizzaOrPasta struct {
	I_pizzaOrPastaTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	Pizza             Pizza `fidl_ordinal:"1"`
	Pasta             Pasta `fidl_ordinal:"2"`
}

func (_m *PizzaOrPasta) Which() I_pizzaOrPastaTag {
	return _m.I_pizzaOrPastaTag
}

func (_m *PizzaOrPasta) Ordinal() uint64 {
	return uint64(_m.I_pizzaOrPastaTag)
}

func (_m *PizzaOrPasta) SetPizza(pizza Pizza) {
	_m.I_pizzaOrPastaTag = PizzaOrPastaPizza
	_m.Pizza = pizza
}

func PizzaOrPastaWithPizza(pizza Pizza) PizzaOrPasta {
	var _u PizzaOrPasta
	_u.SetPizza(pizza)
	return _u
}

func (_m *PizzaOrPasta) SetPasta(pasta Pasta) {
	_m.I_pizzaOrPastaTag = PizzaOrPastaPasta
	_m.Pasta = pasta
}

func PizzaOrPastaWithPasta(pasta Pasta) PizzaOrPasta {
	var _u PizzaOrPasta
	_u.SetPasta(pasta)
	return _u
}

type I_explicitPizzaOrPastaTag uint64

const (
	ExplicitPizzaOrPastaPizza = 1 // 0x00000001
	ExplicitPizzaOrPastaPasta = 4 // 0x00000004
)

type ExplicitPizzaOrPasta struct {
	I_explicitPizzaOrPastaTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	Pizza                     Pizza `fidl_ordinal:"1"`
	Pasta                     Pasta `fidl_ordinal:"4"`
}

func (_m *ExplicitPizzaOrPasta) Which() I_explicitPizzaOrPastaTag {
	return _m.I_explicitPizzaOrPastaTag
}

func (_m *ExplicitPizzaOrPasta) Ordinal() uint64 {
	return uint64(_m.I_explicitPizzaOrPastaTag)
}

func (_m *ExplicitPizzaOrPasta) SetPizza(pizza Pizza) {
	_m.I_explicitPizzaOrPastaTag = ExplicitPizzaOrPastaPizza
	_m.Pizza = pizza
}

func ExplicitPizzaOrPastaWithPizza(pizza Pizza) ExplicitPizzaOrPasta {
	var _u ExplicitPizzaOrPasta
	_u.SetPizza(pizza)
	return _u
}

func (_m *ExplicitPizzaOrPasta) SetPasta(pasta Pasta) {
	_m.I_explicitPizzaOrPastaTag = ExplicitPizzaOrPastaPasta
	_m.Pasta = pasta
}

func ExplicitPizzaOrPastaWithPasta(pasta Pasta) ExplicitPizzaOrPasta {
	var _u ExplicitPizzaOrPasta
	_u.SetPasta(pasta)
	return _u
}

type I_flexiblePizzaOrPastaTag uint64

const (
	FlexiblePizzaOrPasta_unknownData = 0 // 0x00000000
	FlexiblePizzaOrPastaPizza        = 1 // 0x00000001
	FlexiblePizzaOrPastaPasta        = 2 // 0x00000002
)

type FlexiblePizzaOrPasta struct {
	I_flexiblePizzaOrPastaTag `fidl:"x" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData             interface{}
	Pizza                     Pizza `fidl_ordinal:"1"`
	Pasta                     Pasta `fidl_ordinal:"2"`
}

func (_m *FlexiblePizzaOrPasta) Which() I_flexiblePizzaOrPastaTag {
	switch _m.I_flexiblePizzaOrPastaTag {
	case 1:
		return FlexiblePizzaOrPastaPizza
	case 2:
		return FlexiblePizzaOrPastaPasta
	default:
		return FlexiblePizzaOrPasta_unknownData
	}
}

func (_m *FlexiblePizzaOrPasta) Ordinal() uint64 {
	return uint64(_m.I_flexiblePizzaOrPastaTag)
}

func (_m *FlexiblePizzaOrPasta) SetPizza(pizza Pizza) {
	_m.I_flexiblePizzaOrPastaTag = FlexiblePizzaOrPastaPizza
	_m.Pizza = pizza
}

func FlexiblePizzaOrPastaWithPizza(pizza Pizza) FlexiblePizzaOrPasta {
	var _u FlexiblePizzaOrPasta
	_u.SetPizza(pizza)
	return _u
}

func (_m *FlexiblePizzaOrPasta) SetPasta(pasta Pasta) {
	_m.I_flexiblePizzaOrPastaTag = FlexiblePizzaOrPastaPasta
	_m.Pasta = pasta
}

func FlexiblePizzaOrPastaWithPasta(pasta Pasta) FlexiblePizzaOrPasta {
	var _u FlexiblePizzaOrPasta
	_u.SetPasta(pasta)
	return _u
}
func (_m *FlexiblePizzaOrPasta) GetUnknownData() _bindings.UnknownData {
	return _m.I_unknownData.(_bindings.UnknownData)
}

type I_strictPizzaOrPastaTag uint64

const (
	StrictPizzaOrPastaPizza = 1 // 0x00000001
	StrictPizzaOrPastaPasta = 2 // 0x00000002
)

type StrictPizzaOrPasta struct {
	I_strictPizzaOrPastaTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	Pizza                   Pizza `fidl_ordinal:"1"`
	Pasta                   Pasta `fidl_ordinal:"2"`
}

func (_m *StrictPizzaOrPasta) Which() I_strictPizzaOrPastaTag {
	return _m.I_strictPizzaOrPastaTag
}

func (_m *StrictPizzaOrPasta) Ordinal() uint64 {
	return uint64(_m.I_strictPizzaOrPastaTag)
}

func (_m *StrictPizzaOrPasta) SetPizza(pizza Pizza) {
	_m.I_strictPizzaOrPastaTag = StrictPizzaOrPastaPizza
	_m.Pizza = pizza
}

func StrictPizzaOrPastaWithPizza(pizza Pizza) StrictPizzaOrPasta {
	var _u StrictPizzaOrPasta
	_u.SetPizza(pizza)
	return _u
}

func (_m *StrictPizzaOrPasta) SetPasta(pasta Pasta) {
	_m.I_strictPizzaOrPastaTag = StrictPizzaOrPastaPasta
	_m.Pasta = pasta
}

func StrictPizzaOrPastaWithPasta(pasta Pasta) StrictPizzaOrPasta {
	var _u StrictPizzaOrPasta
	_u.SetPasta(pasta)
	return _u
}

type I_unionTag uint64

const (
	UnionPrimitive                        = 1 // 0x00000001
	UnionStringNeedsConstructor           = 2 // 0x00000002
	UnionVectorStringAlsoNeedsConstructor = 3 // 0x00000003
)

type Union struct {
	I_unionTag                       `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	Primitive                        int32    `fidl_ordinal:"1"`
	StringNeedsConstructor           string   `fidl_bounds:"" fidl_ordinal:"2"`
	VectorStringAlsoNeedsConstructor []string `fidl_bounds:"" fidl_ordinal:"3"`
}

func (_m *Union) Which() I_unionTag {
	return _m.I_unionTag
}

func (_m *Union) Ordinal() uint64 {
	return uint64(_m.I_unionTag)
}

func (_m *Union) SetPrimitive(primitive int32) {
	_m.I_unionTag = UnionPrimitive
	_m.Primitive = primitive
}

func UnionWithPrimitive(primitive int32) Union {
	var _u Union
	_u.SetPrimitive(primitive)
	return _u
}

func (_m *Union) SetStringNeedsConstructor(stringNeedsConstructor string) {
	_m.I_unionTag = UnionStringNeedsConstructor
	_m.StringNeedsConstructor = stringNeedsConstructor
}

func UnionWithStringNeedsConstructor(stringNeedsConstructor string) Union {
	var _u Union
	_u.SetStringNeedsConstructor(stringNeedsConstructor)
	return _u
}

func (_m *Union) SetVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor []string) {
	_m.I_unionTag = UnionVectorStringAlsoNeedsConstructor
	_m.VectorStringAlsoNeedsConstructor = vectorStringAlsoNeedsConstructor
}

func UnionWithVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor []string) Union {
	var _u Union
	_u.SetVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor)
	return _u
}

type I_flexibleUnionTag uint64

const (
	FlexibleUnion_unknownData                     = 0 // 0x00000000
	FlexibleUnionPrimitive                        = 1 // 0x00000001
	FlexibleUnionStringNeedsConstructor           = 2 // 0x00000002
	FlexibleUnionVectorStringAlsoNeedsConstructor = 3 // 0x00000003
)

type FlexibleUnion struct {
	I_flexibleUnionTag               `fidl:"x" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData                    interface{}
	Primitive                        int32    `fidl_ordinal:"1"`
	StringNeedsConstructor           string   `fidl_bounds:"" fidl_ordinal:"2"`
	VectorStringAlsoNeedsConstructor []string `fidl_bounds:"" fidl_ordinal:"3"`
}

func (_m *FlexibleUnion) Which() I_flexibleUnionTag {
	switch _m.I_flexibleUnionTag {
	case 1:
		return FlexibleUnionPrimitive
	case 2:
		return FlexibleUnionStringNeedsConstructor
	case 3:
		return FlexibleUnionVectorStringAlsoNeedsConstructor
	default:
		return FlexibleUnion_unknownData
	}
}

func (_m *FlexibleUnion) Ordinal() uint64 {
	return uint64(_m.I_flexibleUnionTag)
}

func (_m *FlexibleUnion) SetPrimitive(primitive int32) {
	_m.I_flexibleUnionTag = FlexibleUnionPrimitive
	_m.Primitive = primitive
}

func FlexibleUnionWithPrimitive(primitive int32) FlexibleUnion {
	var _u FlexibleUnion
	_u.SetPrimitive(primitive)
	return _u
}

func (_m *FlexibleUnion) SetStringNeedsConstructor(stringNeedsConstructor string) {
	_m.I_flexibleUnionTag = FlexibleUnionStringNeedsConstructor
	_m.StringNeedsConstructor = stringNeedsConstructor
}

func FlexibleUnionWithStringNeedsConstructor(stringNeedsConstructor string) FlexibleUnion {
	var _u FlexibleUnion
	_u.SetStringNeedsConstructor(stringNeedsConstructor)
	return _u
}

func (_m *FlexibleUnion) SetVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor []string) {
	_m.I_flexibleUnionTag = FlexibleUnionVectorStringAlsoNeedsConstructor
	_m.VectorStringAlsoNeedsConstructor = vectorStringAlsoNeedsConstructor
}

func FlexibleUnionWithVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor []string) FlexibleUnion {
	var _u FlexibleUnion
	_u.SetVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor)
	return _u
}
func (_m *FlexibleUnion) GetUnknownData() _bindings.UnknownData {
	return _m.I_unknownData.(_bindings.UnknownData)
}

type I_strictUnionTag uint64

const (
	StrictUnionPrimitive                        = 1 // 0x00000001
	StrictUnionStringNeedsConstructor           = 2 // 0x00000002
	StrictUnionVectorStringAlsoNeedsConstructor = 3 // 0x00000003
)

type StrictUnion struct {
	I_strictUnionTag                 `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	Primitive                        int32    `fidl_ordinal:"1"`
	StringNeedsConstructor           string   `fidl_bounds:"" fidl_ordinal:"2"`
	VectorStringAlsoNeedsConstructor []string `fidl_bounds:"" fidl_ordinal:"3"`
}

func (_m *StrictUnion) Which() I_strictUnionTag {
	return _m.I_strictUnionTag
}

func (_m *StrictUnion) Ordinal() uint64 {
	return uint64(_m.I_strictUnionTag)
}

func (_m *StrictUnion) SetPrimitive(primitive int32) {
	_m.I_strictUnionTag = StrictUnionPrimitive
	_m.Primitive = primitive
}

func StrictUnionWithPrimitive(primitive int32) StrictUnion {
	var _u StrictUnion
	_u.SetPrimitive(primitive)
	return _u
}

func (_m *StrictUnion) SetStringNeedsConstructor(stringNeedsConstructor string) {
	_m.I_strictUnionTag = StrictUnionStringNeedsConstructor
	_m.StringNeedsConstructor = stringNeedsConstructor
}

func StrictUnionWithStringNeedsConstructor(stringNeedsConstructor string) StrictUnion {
	var _u StrictUnion
	_u.SetStringNeedsConstructor(stringNeedsConstructor)
	return _u
}

func (_m *StrictUnion) SetVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor []string) {
	_m.I_strictUnionTag = StrictUnionVectorStringAlsoNeedsConstructor
	_m.VectorStringAlsoNeedsConstructor = vectorStringAlsoNeedsConstructor
}

func StrictUnionWithVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor []string) StrictUnion {
	var _u StrictUnion
	_u.SetVectorStringAlsoNeedsConstructor(vectorStringAlsoNeedsConstructor)
	return _u
}

type I_fieldCollisionTag uint64

const (
	FieldCollisionFieldCollisionTag = 1 // 0x00000001
)

type FieldCollision struct {
	I_fieldCollisionTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	FieldCollisionTag   int32 `fidl_ordinal:"1"`
}

func (_m *FieldCollision) Which() I_fieldCollisionTag {
	return _m.I_fieldCollisionTag
}

func (_m *FieldCollision) Ordinal() uint64 {
	return uint64(_m.I_fieldCollisionTag)
}

func (_m *FieldCollision) SetFieldCollisionTag(fieldCollisionTag int32) {
	_m.I_fieldCollisionTag = FieldCollisionFieldCollisionTag
	_m.FieldCollisionTag = fieldCollisionTag
}

func FieldCollisionWithFieldCollisionTag(fieldCollisionTag int32) FieldCollision {
	var _u FieldCollision
	_u.SetFieldCollisionTag(fieldCollisionTag)
	return _u
}

type I_explicitUnionTag uint64

const (
	ExplicitUnionPrimitive              = 1 // 0x00000001
	ExplicitUnionStringNeedsConstructor = 3 // 0x00000003
)

type ExplicitUnion struct {
	I_explicitUnionTag     `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	Primitive              int32  `fidl_ordinal:"1"`
	StringNeedsConstructor string `fidl_bounds:"" fidl_ordinal:"3"`
}

func (_m *ExplicitUnion) Which() I_explicitUnionTag {
	return _m.I_explicitUnionTag
}

func (_m *ExplicitUnion) Ordinal() uint64 {
	return uint64(_m.I_explicitUnionTag)
}

func (_m *ExplicitUnion) SetPrimitive(primitive int32) {
	_m.I_explicitUnionTag = ExplicitUnionPrimitive
	_m.Primitive = primitive
}

func ExplicitUnionWithPrimitive(primitive int32) ExplicitUnion {
	var _u ExplicitUnion
	_u.SetPrimitive(primitive)
	return _u
}

func (_m *ExplicitUnion) SetStringNeedsConstructor(stringNeedsConstructor string) {
	_m.I_explicitUnionTag = ExplicitUnionStringNeedsConstructor
	_m.StringNeedsConstructor = stringNeedsConstructor
}

func ExplicitUnionWithStringNeedsConstructor(stringNeedsConstructor string) ExplicitUnion {
	var _u ExplicitUnion
	_u.SetStringNeedsConstructor(stringNeedsConstructor)
	return _u
}

type I_reverseOrdinalUnionTag uint64

const (
	ReverseOrdinalUnionSecond = 2 // 0x00000002
	ReverseOrdinalUnionFirst  = 1 // 0x00000001
)

type ReverseOrdinalUnion struct {
	I_reverseOrdinalUnionTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	Second                   uint32 `fidl_ordinal:"2"`
	First                    uint32 `fidl_ordinal:"1"`
}

func (_m *ReverseOrdinalUnion) Which() I_reverseOrdinalUnionTag {
	return _m.I_reverseOrdinalUnionTag
}

func (_m *ReverseOrdinalUnion) Ordinal() uint64 {
	return uint64(_m.I_reverseOrdinalUnionTag)
}

func (_m *ReverseOrdinalUnion) SetSecond(second uint32) {
	_m.I_reverseOrdinalUnionTag = ReverseOrdinalUnionSecond
	_m.Second = second
}

func ReverseOrdinalUnionWithSecond(second uint32) ReverseOrdinalUnion {
	var _u ReverseOrdinalUnion
	_u.SetSecond(second)
	return _u
}

func (_m *ReverseOrdinalUnion) SetFirst(first uint32) {
	_m.I_reverseOrdinalUnionTag = ReverseOrdinalUnionFirst
	_m.First = first
}

func ReverseOrdinalUnionWithFirst(first uint32) ReverseOrdinalUnion {
	var _u ReverseOrdinalUnion
	_u.SetFirst(first)
	return _u
}

type I_flexibleFooTag uint64

const (
	FlexibleFoo_unknownData = 0 // 0x00000000
	FlexibleFooS            = 1 // 0x00000001
	FlexibleFooI            = 2 // 0x00000002
)

type FlexibleFoo struct {
	I_flexibleFooTag `fidl:"x" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData    interface{}
	S                string `fidl_bounds:"" fidl_ordinal:"1"`
	I                int32  `fidl_ordinal:"2"`
}

func (_m *FlexibleFoo) Which() I_flexibleFooTag {
	switch _m.I_flexibleFooTag {
	case 1:
		return FlexibleFooS
	case 2:
		return FlexibleFooI
	default:
		return FlexibleFoo_unknownData
	}
}

func (_m *FlexibleFoo) Ordinal() uint64 {
	return uint64(_m.I_flexibleFooTag)
}

func (_m *FlexibleFoo) SetS(s string) {
	_m.I_flexibleFooTag = FlexibleFooS
	_m.S = s
}

func FlexibleFooWithS(s string) FlexibleFoo {
	var _u FlexibleFoo
	_u.SetS(s)
	return _u
}

func (_m *FlexibleFoo) SetI(i int32) {
	_m.I_flexibleFooTag = FlexibleFooI
	_m.I = i
}

func FlexibleFooWithI(i int32) FlexibleFoo {
	var _u FlexibleFoo
	_u.SetI(i)
	return _u
}
func (_m *FlexibleFoo) GetUnknownData() _bindings.UnknownData {
	return _m.I_unknownData.(_bindings.UnknownData)
}

type I_strictFooTag uint64

const (
	StrictFooS = 1 // 0x00000001
	StrictFooI = 2 // 0x00000002
)

type StrictFoo struct {
	I_strictFooTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	S              string `fidl_bounds:"" fidl_ordinal:"1"`
	I              int32  `fidl_ordinal:"2"`
}

func (_m *StrictFoo) Which() I_strictFooTag {
	return _m.I_strictFooTag
}

func (_m *StrictFoo) Ordinal() uint64 {
	return uint64(_m.I_strictFooTag)
}

func (_m *StrictFoo) SetS(s string) {
	_m.I_strictFooTag = StrictFooS
	_m.S = s
}

func StrictFooWithS(s string) StrictFoo {
	var _u StrictFoo
	_u.SetS(s)
	return _u
}

func (_m *StrictFoo) SetI(i int32) {
	_m.I_strictFooTag = StrictFooI
	_m.I = i
}

func StrictFooWithI(i int32) StrictFoo {
	var _u StrictFoo
	_u.SetI(i)
	return _u
}

type I_explicitFooTag uint64

const (
	ExplicitFoo_unknownData = 0 // 0x00000000
	ExplicitFooS            = 2 // 0x00000002
	ExplicitFooI            = 1 // 0x00000001
)

type ExplicitFoo struct {
	I_explicitFooTag `fidl:"x" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData    interface{}
	S                string `fidl_bounds:"" fidl_ordinal:"2"`
	I                int32  `fidl_ordinal:"1"`
}

func (_m *ExplicitFoo) Which() I_explicitFooTag {
	switch _m.I_explicitFooTag {
	case 2:
		return ExplicitFooS
	case 1:
		return ExplicitFooI
	default:
		return ExplicitFoo_unknownData
	}
}

func (_m *ExplicitFoo) Ordinal() uint64 {
	return uint64(_m.I_explicitFooTag)
}

func (_m *ExplicitFoo) SetS(s string) {
	_m.I_explicitFooTag = ExplicitFooS
	_m.S = s
}

func ExplicitFooWithS(s string) ExplicitFoo {
	var _u ExplicitFoo
	_u.SetS(s)
	return _u
}

func (_m *ExplicitFoo) SetI(i int32) {
	_m.I_explicitFooTag = ExplicitFooI
	_m.I = i
}

func ExplicitFooWithI(i int32) ExplicitFoo {
	var _u ExplicitFoo
	_u.SetI(i)
	return _u
}
func (_m *ExplicitFoo) GetUnknownData() _bindings.UnknownData {
	return _m.I_unknownData.(_bindings.UnknownData)
}

type I_explicitStrictFooTag uint64

const (
	ExplicitStrictFooS = 3 // 0x00000003
	ExplicitStrictFooI = 2 // 0x00000002
)

type ExplicitStrictFoo struct {
	I_explicitStrictFooTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	S                      string `fidl_bounds:"" fidl_ordinal:"3"`
	I                      int32  `fidl_ordinal:"2"`
}

func (_m *ExplicitStrictFoo) Which() I_explicitStrictFooTag {
	return _m.I_explicitStrictFooTag
}

func (_m *ExplicitStrictFoo) Ordinal() uint64 {
	return uint64(_m.I_explicitStrictFooTag)
}

func (_m *ExplicitStrictFoo) SetS(s string) {
	_m.I_explicitStrictFooTag = ExplicitStrictFooS
	_m.S = s
}

func ExplicitStrictFooWithS(s string) ExplicitStrictFoo {
	var _u ExplicitStrictFoo
	_u.SetS(s)
	return _u
}

func (_m *ExplicitStrictFoo) SetI(i int32) {
	_m.I_explicitStrictFooTag = ExplicitStrictFooI
	_m.I = i
}

func ExplicitStrictFooWithI(i int32) ExplicitStrictFoo {
	var _u ExplicitStrictFoo
	_u.SetI(i)
	return _u
}

type I_olderSimpleUnionTag uint64

const (
	OlderSimpleUnion_unknownData = 0 // 0x00000000
	OlderSimpleUnionI            = 1 // 0x00000001
	OlderSimpleUnionF            = 2 // 0x00000002
)

type OlderSimpleUnion struct {
	I_olderSimpleUnionTag `fidl:"x" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData         interface{}
	I                     int64   `fidl_ordinal:"1"`
	F                     float32 `fidl_ordinal:"2"`
}

func (_m *OlderSimpleUnion) Which() I_olderSimpleUnionTag {
	switch _m.I_olderSimpleUnionTag {
	case 1:
		return OlderSimpleUnionI
	case 2:
		return OlderSimpleUnionF
	default:
		return OlderSimpleUnion_unknownData
	}
}

func (_m *OlderSimpleUnion) Ordinal() uint64 {
	return uint64(_m.I_olderSimpleUnionTag)
}

func (_m *OlderSimpleUnion) SetI(i int64) {
	_m.I_olderSimpleUnionTag = OlderSimpleUnionI
	_m.I = i
}

func OlderSimpleUnionWithI(i int64) OlderSimpleUnion {
	var _u OlderSimpleUnion
	_u.SetI(i)
	return _u
}

func (_m *OlderSimpleUnion) SetF(f float32) {
	_m.I_olderSimpleUnionTag = OlderSimpleUnionF
	_m.F = f
}

func OlderSimpleUnionWithF(f float32) OlderSimpleUnion {
	var _u OlderSimpleUnion
	_u.SetF(f)
	return _u
}
func (_m *OlderSimpleUnion) GetUnknownData() _bindings.UnknownData {
	return _m.I_unknownData.(_bindings.UnknownData)
}

type I_newerSimpleUnionTag uint64

const (
	NewerSimpleUnion_unknownData = 0 // 0x00000000
	NewerSimpleUnionI            = 1 // 0x00000001
	NewerSimpleUnionS            = 2 // 0x00000002
	NewerSimpleUnionV            = 3 // 0x00000003
)

type NewerSimpleUnion struct {
	I_newerSimpleUnionTag `fidl:"x" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData         interface{}
	I                     int64    `fidl_ordinal:"1"`
	S                     string   `fidl_bounds:"" fidl_ordinal:"2"`
	V                     []string `fidl_bounds:"" fidl_ordinal:"3"`
}

func (_m *NewerSimpleUnion) Which() I_newerSimpleUnionTag {
	switch _m.I_newerSimpleUnionTag {
	case 1:
		return NewerSimpleUnionI
	case 2:
		return NewerSimpleUnionS
	case 3:
		return NewerSimpleUnionV
	default:
		return NewerSimpleUnion_unknownData
	}
}

func (_m *NewerSimpleUnion) Ordinal() uint64 {
	return uint64(_m.I_newerSimpleUnionTag)
}

func (_m *NewerSimpleUnion) SetI(i int64) {
	_m.I_newerSimpleUnionTag = NewerSimpleUnionI
	_m.I = i
}

func NewerSimpleUnionWithI(i int64) NewerSimpleUnion {
	var _u NewerSimpleUnion
	_u.SetI(i)
	return _u
}

func (_m *NewerSimpleUnion) SetS(s string) {
	_m.I_newerSimpleUnionTag = NewerSimpleUnionS
	_m.S = s
}

func NewerSimpleUnionWithS(s string) NewerSimpleUnion {
	var _u NewerSimpleUnion
	_u.SetS(s)
	return _u
}

func (_m *NewerSimpleUnion) SetV(v []string) {
	_m.I_newerSimpleUnionTag = NewerSimpleUnionV
	_m.V = v
}

func NewerSimpleUnionWithV(v []string) NewerSimpleUnion {
	var _u NewerSimpleUnion
	_u.SetV(v)
	return _u
}
func (_m *NewerSimpleUnion) GetUnknownData() _bindings.UnknownData {
	return _m.I_unknownData.(_bindings.UnknownData)
}

type I_strictSimpleXUnionTag uint64

const (
	StrictSimpleXUnionI = 1 // 0x00000001
	StrictSimpleXUnionF = 2 // 0x00000002
	StrictSimpleXUnionS = 3 // 0x00000003
)

type StrictSimpleXUnion struct {
	I_strictSimpleXUnionTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I                       int32   `fidl_ordinal:"1"`
	F                       float32 `fidl_ordinal:"2"`
	S                       string  `fidl_bounds:"" fidl_ordinal:"3"`
}

func (_m *StrictSimpleXUnion) Which() I_strictSimpleXUnionTag {
	return _m.I_strictSimpleXUnionTag
}

func (_m *StrictSimpleXUnion) Ordinal() uint64 {
	return uint64(_m.I_strictSimpleXUnionTag)
}

func (_m *StrictSimpleXUnion) SetI(i int32) {
	_m.I_strictSimpleXUnionTag = StrictSimpleXUnionI
	_m.I = i
}

func StrictSimpleXUnionWithI(i int32) StrictSimpleXUnion {
	var _u StrictSimpleXUnion
	_u.SetI(i)
	return _u
}

func (_m *StrictSimpleXUnion) SetF(f float32) {
	_m.I_strictSimpleXUnionTag = StrictSimpleXUnionF
	_m.F = f
}

func StrictSimpleXUnionWithF(f float32) StrictSimpleXUnion {
	var _u StrictSimpleXUnion
	_u.SetF(f)
	return _u
}

func (_m *StrictSimpleXUnion) SetS(s string) {
	_m.I_strictSimpleXUnionTag = StrictSimpleXUnionS
	_m.S = s
}

func StrictSimpleXUnionWithS(s string) StrictSimpleXUnion {
	var _u StrictSimpleXUnion
	_u.SetS(s)
	return _u
}

type I_xUnionContainingEmptyStructTag uint64

const (
	XUnionContainingEmptyStruct_unknownData = 0 // 0x00000000
	XUnionContainingEmptyStructEmpty        = 1 // 0x00000001
)

type XUnionContainingEmptyStruct struct {
	I_xUnionContainingEmptyStructTag `fidl:"x" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData                    interface{}
	Empty                            Empty `fidl_ordinal:"1"`
}

func (_m *XUnionContainingEmptyStruct) Which() I_xUnionContainingEmptyStructTag {
	switch _m.I_xUnionContainingEmptyStructTag {
	case 1:
		return XUnionContainingEmptyStructEmpty
	default:
		return XUnionContainingEmptyStruct_unknownData
	}
}

func (_m *XUnionContainingEmptyStruct) Ordinal() uint64 {
	return uint64(_m.I_xUnionContainingEmptyStructTag)
}

func (_m *XUnionContainingEmptyStruct) SetEmpty(empty Empty) {
	_m.I_xUnionContainingEmptyStructTag = XUnionContainingEmptyStructEmpty
	_m.Empty = empty
}

func XUnionContainingEmptyStructWithEmpty(empty Empty) XUnionContainingEmptyStruct {
	var _u XUnionContainingEmptyStruct
	_u.SetEmpty(empty)
	return _u
}
func (_m *XUnionContainingEmptyStruct) GetUnknownData() _bindings.UnknownData {
	return _m.I_unknownData.(_bindings.UnknownData)
}

type I_strictBoundedXUnionTag uint64

const (
	StrictBoundedXUnionV = 1 // 0x00000001
)

type StrictBoundedXUnion struct {
	I_strictBoundedXUnionTag `fidl:"x!" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	V                        []uint8 `fidl_bounds:"10" fidl_ordinal:"1"`
}

func (_m *StrictBoundedXUnion) Which() I_strictBoundedXUnionTag {
	return _m.I_strictBoundedXUnionTag
}

func (_m *StrictBoundedXUnion) Ordinal() uint64 {
	return uint64(_m.I_strictBoundedXUnionTag)
}

func (_m *StrictBoundedXUnion) SetV(v []uint8) {
	_m.I_strictBoundedXUnionTag = StrictBoundedXUnionV
	_m.V = v
}

func StrictBoundedXUnionWithV(v []uint8) StrictBoundedXUnion {
	var _u StrictBoundedXUnion
	_u.SetV(v)
	return _u
}

type I_explicitXUnionTag uint64

const (
	ExplicitXUnion_unknownData = 0 // 0x00000000
	ExplicitXUnionI            = 1 // 0x00000001
	ExplicitXUnionF            = 4 // 0x00000004
)

type ExplicitXUnion struct {
	I_explicitXUnionTag `fidl:"x" fidl_size_v1:"24" fidl_alignment_v1:"8" fidl_resource:"false"`
	I_unknownData       interface{}
	I                   int64   `fidl_ordinal:"1"`
	F                   float32 `fidl_ordinal:"4"`
}

func (_m *ExplicitXUnion) Which() I_explicitXUnionTag {
	switch _m.I_explicitXUnionTag {
	case 1:
		return ExplicitXUnionI
	case 4:
		return ExplicitXUnionF
	default:
		return ExplicitXUnion_unknownData
	}
}

func (_m *ExplicitXUnion) Ordinal() uint64 {
	return uint64(_m.I_explicitXUnionTag)
}

func (_m *ExplicitXUnion) SetI(i int64) {
	_m.I_explicitXUnionTag = ExplicitXUnionI
	_m.I = i
}

func ExplicitXUnionWithI(i int64) ExplicitXUnion {
	var _u ExplicitXUnion
	_u.SetI(i)
	return _u
}

func (_m *ExplicitXUnion) SetF(f float32) {
	_m.I_explicitXUnionTag = ExplicitXUnionF
	_m.F = f
}

func ExplicitXUnionWithF(f float32) ExplicitXUnion {
	var _u ExplicitXUnion
	_u.SetF(f)
	return _u
}
func (_m *ExplicitXUnion) GetUnknownData() _bindings.UnknownData {
	return _m.I_unknownData.(_bindings.UnknownData)
}

const (
	TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedOrdinal   uint64 = 0x747b084a44f0dc3e
	TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedOrdinal uint64 = 0x57615a25c2a785d2
)

type TestProtocolWithCtxInterface _bindings.ChannelProxy

func (p *TestProtocolWithCtxInterface) StrictXUnionHenceResponseMayBeStackAllocated(ctx_ _bindings.Context) (StrictBoundedXUnion, error) {
	var req_ _bindings.Message
	resp_ := &testProtocolWithCtxStrictXUnionHenceResponseMayBeStackAllocatedResponse{}
	err_ := ((*_bindings.ChannelProxy)(p)).Call(TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedOrdinal, req_, resp_)
	return resp_.Xu, err_
}

func (p *TestProtocolWithCtxInterface) FlexibleXUnionHenceResponseMustBeHeapAllocated(ctx_ _bindings.Context) (OlderSimpleUnion, error) {
	var req_ _bindings.Message
	resp_ := &testProtocolWithCtxFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse{}
	err_ := ((*_bindings.ChannelProxy)(p)).Call(TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedOrdinal, req_, resp_)
	return resp_.Xu, err_
}

type TestProtocolWithCtx interface {
	StrictXUnionHenceResponseMayBeStackAllocated(ctx_ _bindings.Context) (StrictBoundedXUnion, error)
	FlexibleXUnionHenceResponseMustBeHeapAllocated(ctx_ _bindings.Context) (OlderSimpleUnion, error)
}

type TestProtocolWithCtxTransitionalBase struct{}

type TestProtocolWithCtxInterfaceRequest _bindings.InterfaceRequest

func NewTestProtocolWithCtxInterfaceRequest() (TestProtocolWithCtxInterfaceRequest, *TestProtocolWithCtxInterface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return TestProtocolWithCtxInterfaceRequest(req), (*TestProtocolWithCtxInterface)(cli), err
}

type TestProtocolWithCtxStub struct {
	Impl TestProtocolWithCtx
}

func (s_ *TestProtocolWithCtxStub) Dispatch(args_ _bindings.DispatchArgs) (_bindings.Message, bool, error) {
	switch args_.Ordinal {
	case TestProtocolStrictXUnionHenceResponseMayBeStackAllocatedOrdinal:
		xu, err_ := s_.Impl.StrictXUnionHenceResponseMayBeStackAllocated(args_.Ctx)
		out_ := testProtocolWithCtxStrictXUnionHenceResponseMayBeStackAllocatedResponse{}
		out_.Xu = xu
		return &out_, true, err_
	case TestProtocolFlexibleXUnionHenceResponseMustBeHeapAllocatedOrdinal:
		xu, err_ := s_.Impl.FlexibleXUnionHenceResponseMustBeHeapAllocated(args_.Ctx)
		out_ := testProtocolWithCtxFlexibleXUnionHenceResponseMustBeHeapAllocatedResponse{}
		out_.Xu = xu
		return &out_, true, err_
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type TestProtocolEventProxy _bindings.ChannelProxy
