// Code generated by fidlgen; DO NOT EDIT.

package typealiases

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

var _ _bindings.Enum = ObjType(0)

type ObjType uint32

const (
	ObjTypeNone    ObjType = 0
	ObjTypeChannel ObjType = 4
)

func (_ ObjType) I_EnumValues() []ObjType {
	return []ObjType{
		ObjTypeNone,
		ObjTypeChannel,
	}
}

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

func (x ObjType) IsUnknown() bool {
	switch x {
	case 0:
		return true
	case 4:
		return true
	default:
		return false
	}
}

func (x ObjType) String() string {
	switch x {
	case 0:
		return "None"
	case 4:
		return "Channel"
	}
	return "Unknown"
}

type ExampleOfUseOfAliases struct {
	_                             struct{}                       `fidl:"s" fidl_size_v1:"88" fidl_alignment_v1:"8"`
	FieldOfU32                    uint32                         `fidl_offset_v1:"0"`
	FieldOfVecOfStrings           []string                       `fidl_offset_v1:"8" fidl_bounds:""`
	FieldOfVecOfStringsAtMostNine []string                       `fidl_offset_v1:"24" fidl_bounds:"9,"`
	FieldOfVecOfStringsAtMost5    []string                       `fidl_offset_v1:"40" fidl_bounds:"5,"`
	FieldOfVecOfRefMeAtMost5      []someotherlibrary.ReferenceMe `fidl_offset_v1:"56" fidl_bounds:"5"`
	FieldOfChannel                _zx.Channel                    `fidl_offset_v1:"72" fidl_handle_subtype:"4" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	FieldOfClientEnd              _zx.Channel                    `fidl_offset_v1:"76" fidl_handle_subtype:"4" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
	FieldOfNullableClientEnd      _zx.Channel                    `fidl_offset_v1:"80" fidl_handle_subtype:"4" fidl_handle_rights:"2147483648" fidl_bounds:"1"`
}

var _mExampleOfUseOfAliases = _bindings.CreateLazyMarshaler(ExampleOfUseOfAliases{})

func (msg *ExampleOfUseOfAliases) Marshaler() _bindings.Marshaler {
	return _mExampleOfUseOfAliases
}
