// 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) reset() {
	switch _m.I_pizzaOrPastaTag {
	case 1:
		var _zeroed Pizza
		_m.Pizza = _zeroed
	case 2:
		var _zeroed Pasta
		_m.Pasta = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_explicitPizzaOrPastaTag {
	case 1:
		var _zeroed Pizza
		_m.Pizza = _zeroed
	case 4:
		var _zeroed Pasta
		_m.Pasta = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_flexiblePizzaOrPastaTag {
	case 1:
		var _zeroed Pizza
		_m.Pizza = _zeroed
	case 2:
		var _zeroed Pasta
		_m.Pasta = _zeroed
	default:
		var _zeroed interface{}
		_m.I_unknownData = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_strictPizzaOrPastaTag {
	case 1:
		var _zeroed Pizza
		_m.Pizza = _zeroed
	case 2:
		var _zeroed Pasta
		_m.Pasta = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_unionTag {
	case 1:
		var _zeroed int32
		_m.Primitive = _zeroed
	case 2:
		var _zeroed string
		_m.StringNeedsConstructor = _zeroed
	case 3:
		var _zeroed []string
		_m.VectorStringAlsoNeedsConstructor = _zeroed
	}
}

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.reset()
	_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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_flexibleUnionTag {
	case 1:
		var _zeroed int32
		_m.Primitive = _zeroed
	case 2:
		var _zeroed string
		_m.StringNeedsConstructor = _zeroed
	case 3:
		var _zeroed []string
		_m.VectorStringAlsoNeedsConstructor = _zeroed
	default:
		var _zeroed interface{}
		_m.I_unknownData = _zeroed
	}
}

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.reset()
	_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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_strictUnionTag {
	case 1:
		var _zeroed int32
		_m.Primitive = _zeroed
	case 2:
		var _zeroed string
		_m.StringNeedsConstructor = _zeroed
	case 3:
		var _zeroed []string
		_m.VectorStringAlsoNeedsConstructor = _zeroed
	}
}

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.reset()
	_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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_fieldCollisionTag {
	case 1:
		var _zeroed int32
		_m.FieldCollisionTag = _zeroed
	}
}

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.reset()
	_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) reset() {
	switch _m.I_explicitUnionTag {
	case 1:
		var _zeroed int32
		_m.Primitive = _zeroed
	case 3:
		var _zeroed string
		_m.StringNeedsConstructor = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_reverseOrdinalUnionTag {
	case 2:
		var _zeroed uint32
		_m.Second = _zeroed
	case 1:
		var _zeroed uint32
		_m.First = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_flexibleFooTag {
	case 1:
		var _zeroed string
		_m.S = _zeroed
	case 2:
		var _zeroed int32
		_m.I = _zeroed
	default:
		var _zeroed interface{}
		_m.I_unknownData = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_strictFooTag {
	case 1:
		var _zeroed string
		_m.S = _zeroed
	case 2:
		var _zeroed int32
		_m.I = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_explicitFooTag {
	case 2:
		var _zeroed string
		_m.S = _zeroed
	case 1:
		var _zeroed int32
		_m.I = _zeroed
	default:
		var _zeroed interface{}
		_m.I_unknownData = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_explicitStrictFooTag {
	case 3:
		var _zeroed string
		_m.S = _zeroed
	case 2:
		var _zeroed int32
		_m.I = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_olderSimpleUnionTag {
	case 1:
		var _zeroed int64
		_m.I = _zeroed
	case 2:
		var _zeroed float32
		_m.F = _zeroed
	default:
		var _zeroed interface{}
		_m.I_unknownData = _zeroed
	}
}

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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_newerSimpleUnionTag {
	case 1:
		var _zeroed int64
		_m.I = _zeroed
	case 2:
		var _zeroed string
		_m.S = _zeroed
	case 3:
		var _zeroed []string
		_m.V = _zeroed
	default:
		var _zeroed interface{}
		_m.I_unknownData = _zeroed
	}
}

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.reset()
	_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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_strictSimpleXUnionTag {
	case 1:
		var _zeroed int32
		_m.I = _zeroed
	case 2:
		var _zeroed float32
		_m.F = _zeroed
	case 3:
		var _zeroed string
		_m.S = _zeroed
	}
}

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.reset()
	_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.reset()
	_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.reset()
	_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) reset() {
	switch _m.I_xUnionContainingEmptyStructTag {
	case 1:
		var _zeroed Empty
		_m.Empty = _zeroed
	default:
		var _zeroed interface{}
		_m.I_unknownData = _zeroed
	}
}

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.reset()
	_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) reset() {
	switch _m.I_strictBoundedXUnionTag {
	case 1:
		var _zeroed []uint8
		_m.V = _zeroed
	}
}

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.reset()
	_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) reset() {
	switch _m.I_explicitXUnionTag {
	case 1:
		var _zeroed int64
		_m.I = _zeroed
	case 4:
		var _zeroed float32
		_m.F = _zeroed
	default:
		var _zeroed interface{}
		_m.I_unknownData = _zeroed
	}
}

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.reset()
	_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.reset()
	_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
