// Code generated by fidlgen; DO NOT EDIT.

package encapsulatedstructs

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

type Int8Int32 struct {
	_ struct{} `fidl:"s" fidl_size_v1:"8" fidl_alignment_v1:"4"`
	A int8     `fidl_offset_v1:"0"`
	B int32    `fidl_offset_v1:"4"`
}

var _mInt8Int32 = _bindings.CreateLazyMarshaler(Int8Int32{})

func (msg *Int8Int32) Marshaler() _bindings.Marshaler {
	return _mInt8Int32
}

type Int16Int8 struct {
	_ struct{} `fidl:"s" fidl_size_v1:"4" fidl_alignment_v1:"2"`
	A int16    `fidl_offset_v1:"0"`
	B int8     `fidl_offset_v1:"2"`
}

var _mInt16Int8 = _bindings.CreateLazyMarshaler(Int16Int8{})

func (msg *Int16Int8) Marshaler() _bindings.Marshaler {
	return _mInt16Int8
}

type ArrayInt16Int8 struct {
	_   struct{}     `fidl:"s" fidl_size_v1:"12" fidl_alignment_v1:"2"`
	Arr [3]Int16Int8 `fidl_offset_v1:"0"`
}

var _mArrayInt16Int8 = _bindings.CreateLazyMarshaler(ArrayInt16Int8{})

func (msg *ArrayInt16Int8) Marshaler() _bindings.Marshaler {
	return _mArrayInt16Int8
}

type StructPaddingTestStruct struct {
	_        struct{}       `fidl:"s" fidl_size_v1:"24" fidl_alignment_v1:"4"`
	Trailing Int16Int8      `fidl_offset_v1:"0"`
	Inner    Int8Int32      `fidl_offset_v1:"4"`
	Array    ArrayInt16Int8 `fidl_offset_v1:"12"`
}

var _mStructPaddingTestStruct = _bindings.CreateLazyMarshaler(StructPaddingTestStruct{})

func (msg *StructPaddingTestStruct) Marshaler() _bindings.Marshaler {
	return _mStructPaddingTestStruct
}

type NonInlineStructTestStruct struct {
	_       struct{}   `fidl:"s" fidl_size_v1:"16" fidl_alignment_v1:"8"`
	Element *Int16Int8 `fidl_offset_v1:"0"`
	H       _zx.Handle `fidl_offset_v1:"8" fidl_handle_subtype:"0" fidl_handle_rights:"2147483648" fidl_bounds:"0"`
}

var _mNonInlineStructTestStruct = _bindings.CreateLazyMarshaler(NonInlineStructTestStruct{})

func (msg *NonInlineStructTestStruct) Marshaler() _bindings.Marshaler {
	return _mNonInlineStructTestStruct
}

type TopLevelStruct struct {
	_ struct{}                  `fidl:"s" fidl_size_v1:"40" fidl_alignment_v1:"8"`
	A StructPaddingTestStruct   `fidl_offset_v1:"0"`
	B NonInlineStructTestStruct `fidl_offset_v1:"24"`
}

var _mTopLevelStruct = _bindings.CreateLazyMarshaler(TopLevelStruct{})

func (msg *TopLevelStruct) Marshaler() _bindings.Marshaler {
	return _mTopLevelStruct
}
