// Code generated by fidlgen; DO NOT EDIT.

package handles

import (
	_zx "syscall/zx"
	_bindings "syscall/zx/fidl"
)

var _ _bindings.Enum = ObjType(0)

type ObjType uint32

const (
	ObjTypeNone          ObjType = 0
	ObjTypeProcess       ObjType = 1
	ObjTypeThread        ObjType = 2
	ObjTypeVmo           ObjType = 3
	ObjTypeChannel       ObjType = 4
	ObjTypeEvent         ObjType = 5
	ObjTypePort          ObjType = 6
	ObjTypeInterrupt     ObjType = 9
	ObjTypePciDevice     ObjType = 11
	ObjTypeLog           ObjType = 12
	ObjTypeSocket        ObjType = 14
	ObjTypeResource      ObjType = 15
	ObjTypeEventpair     ObjType = 16
	ObjTypeJob           ObjType = 17
	ObjTypeVmar          ObjType = 18
	ObjTypeFifo          ObjType = 19
	ObjTypeGuest         ObjType = 20
	ObjTypeVcpu          ObjType = 21
	ObjTypeTimer         ObjType = 22
	ObjTypeIommu         ObjType = 23
	ObjTypeBti           ObjType = 24
	ObjTypeProfile       ObjType = 25
	ObjTypePmt           ObjType = 26
	ObjTypeSuspendToken  ObjType = 27
	ObjTypePager         ObjType = 28
	ObjTypeException     ObjType = 29
	ObjTypeClock         ObjType = 30
	ObjTypeStream        ObjType = 31
	ObjTypeMsiAllocation ObjType = 32
	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 (_ ObjType) I_EnumIsStrict() bool {
	return true
}

func (x ObjType) IsUnknown() bool {
	switch x {
	case 0:
		return true
	case 1:
		return true
	case 2:
		return true
	case 3:
		return true
	case 4:
		return true
	case 5:
		return true
	case 6:
		return true
	case 9:
		return true
	case 11:
		return true
	case 12:
		return true
	case 14:
		return true
	case 15:
		return true
	case 16:
		return true
	case 17:
		return true
	case 18:
		return true
	case 19:
		return true
	case 20:
		return true
	case 21:
		return true
	case 22:
		return true
	case 23:
		return true
	case 24:
		return true
	case 25:
		return true
	case 26:
		return true
	case 27:
		return true
	case 28:
		return true
	case 29:
		return true
	case 30:
		return true
	case 31:
		return true
	case 32:
		return true
	case 33:
		return true
	default:
		return false
	}
}

func (x ObjType) String() string {
	switch x {
	case 0:
		return "None"
	case 1:
		return "Process"
	case 2:
		return "Thread"
	case 3:
		return "Vmo"
	case 4:
		return "Channel"
	case 5:
		return "Event"
	case 6:
		return "Port"
	case 9:
		return "Interrupt"
	case 11:
		return "PciDevice"
	case 12:
		return "Log"
	case 14:
		return "Socket"
	case 15:
		return "Resource"
	case 16:
		return "Eventpair"
	case 17:
		return "Job"
	case 18:
		return "Vmar"
	case 19:
		return "Fifo"
	case 20:
		return "Guest"
	case 21:
		return "Vcpu"
	case 22:
		return "Timer"
	case 23:
		return "Iommu"
	case 24:
		return "Bti"
	case 25:
		return "Profile"
	case 26:
		return "Pmt"
	case 27:
		return "SuspendToken"
	case 28:
		return "Pager"
	case 29:
		return "Exception"
	case 30:
		return "Clock"
	case 31:
		return "Stream"
	case 32:
		return "MsiAllocation"
	case 33:
		return "MsiInterrupt"
	}
	return "Unknown"
}

type Handles struct {
	_                         struct{}                            `fidl:"s" fidl_size_v1:"132" fidl_alignment_v1:"4"`
	PlainHandle               _zx.Handle                          `fidl_offset_v1:"0" fidl_handle_subtype:"0" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	BtiHandle                 _zx.Handle                          `fidl_offset_v1:"4" fidl_handle_subtype:"24" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	ChannelHandle             _zx.Channel                         `fidl_offset_v1:"8" fidl_handle_subtype:"4" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	ClockHandle               _zx.Handle                          `fidl_offset_v1:"12" fidl_handle_subtype:"30" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	DebuglogHandle            _zx.Log                             `fidl_offset_v1:"16" fidl_handle_subtype:"12" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	EventHandle               _zx.Event                           `fidl_offset_v1:"20" fidl_handle_subtype:"5" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	EventpairHandle           _zx.Handle                          `fidl_offset_v1:"24" fidl_handle_subtype:"16" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	ExceptionHandle           _zx.Handle                          `fidl_offset_v1:"28" fidl_handle_subtype:"29" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	FifoHandle                _zx.Handle                          `fidl_offset_v1:"32" fidl_handle_subtype:"19" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	GuestHandle               _zx.Handle                          `fidl_offset_v1:"36" fidl_handle_subtype:"20" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	InterruptHandle           _zx.Handle                          `fidl_offset_v1:"40" fidl_handle_subtype:"9" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	IommuHandle               _zx.Handle                          `fidl_offset_v1:"44" fidl_handle_subtype:"23" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	JobHandle                 _zx.Handle                          `fidl_offset_v1:"48" fidl_handle_subtype:"17" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	PagerHandle               _zx.Handle                          `fidl_offset_v1:"52" fidl_handle_subtype:"28" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	PcideviceHandle           _zx.Handle                          `fidl_offset_v1:"56" fidl_handle_subtype:"11" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	PmtHandle                 _zx.Handle                          `fidl_offset_v1:"60" fidl_handle_subtype:"26" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	PortHandle                _zx.Port                            `fidl_offset_v1:"64" fidl_handle_subtype:"6" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	ProcessHandle             _zx.Handle                          `fidl_offset_v1:"68" fidl_handle_subtype:"1" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	ProfileHandle             _zx.Handle                          `fidl_offset_v1:"72" fidl_handle_subtype:"25" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	ResourceHandle            _zx.Handle                          `fidl_offset_v1:"76" fidl_handle_subtype:"15" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	SocketHandle              _zx.Socket                          `fidl_offset_v1:"80" fidl_handle_subtype:"14" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	SuspendtokenHandle        _zx.Handle                          `fidl_offset_v1:"84" fidl_handle_subtype:"27" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	ThreadHandle              _zx.Handle                          `fidl_offset_v1:"88" fidl_handle_subtype:"2" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	TimerHandle               _zx.Handle                          `fidl_offset_v1:"92" fidl_handle_subtype:"22" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	VcpuHandle                _zx.Handle                          `fidl_offset_v1:"96" fidl_handle_subtype:"21" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	VmarHandle                _zx.VMAR                            `fidl_offset_v1:"100" fidl_handle_subtype:"18" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	VmoHandle                 _zx.VMO                             `fidl_offset_v1:"104" fidl_handle_subtype:"3" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	RightsHandle              _zx.VMO                             `fidl_offset_v1:"108" fidl_handle_subtype:"3" fidl_handle_rights:"5" fidl_bounds:"0"`
	AliasedPlainHandleField   _zx.Handle                          `fidl_offset_v1:"112" fidl_handle_subtype:"0" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	AliasedSubtypeHandleField _zx.VMO                             `fidl_offset_v1:"116" fidl_handle_subtype:"3" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	AliasedRightsHandleField  _zx.VMO                             `fidl_offset_v1:"120" fidl_handle_subtype:"3" fidl_handle_rights:"1" fidl_bounds:"0"`
	SomeProtocol              SomeProtocolWithCtxInterface        `fidl_offset_v1:"124" fidl_handle_subtype:"4"`
	RequestSomeProtocol       SomeProtocolWithCtxInterfaceRequest `fidl_offset_v1:"128" fidl_handle_subtype:"4" fidl_bounds:"0"`
}

var _mHandles = _bindings.CreateLazyMarshaler(Handles{})

func (msg *Handles) Marshaler() _bindings.Marshaler {
	return _mHandles
}

const ()

type SomeProtocolWithCtxInterface _bindings.ChannelProxy

type SomeProtocolWithCtx interface {
}

type SomeProtocolWithCtxTransitionalBase struct{}

type SomeProtocolWithCtxInterfaceRequest _bindings.InterfaceRequest

func NewSomeProtocolWithCtxInterfaceRequest() (SomeProtocolWithCtxInterfaceRequest, *SomeProtocolWithCtxInterface, error) {
	req, cli, err := _bindings.NewInterfaceRequest()
	return SomeProtocolWithCtxInterfaceRequest(req), (*SomeProtocolWithCtxInterface)(cli), err
}

type SomeProtocolWithCtxStub struct {
	Impl SomeProtocolWithCtx
}

func (s_ *SomeProtocolWithCtxStub) Dispatch(args_ _bindings.DispatchArgs) (_bindings.Message, bool, error) {
	switch args_.Ordinal {
	}
	return nil, false, _bindings.ErrUnknownOrdinal
}

type SomeProtocolEventProxy _bindings.ChannelProxy
