// WARNING: This file is machine generated by fidlc.

#include <lib/fidl/internal.h>


extern const struct FidlCodedStruct fidl_test_error_Example_foo_ResponseTable;
extern const struct FidlCodedXUnion fidl_test_error_Example_foo_ResultTable;
extern const struct FidlCodedXUnion fidl_test_error_Example_foo_ResultNullableRefTable;


static const struct FidlCodedString String4294967295nonnullableTable = {.tag=kFidlTypeString, .max_size=4294967295u, .nullable=kFidlNullability_Nonnullable};

extern const struct FidlCodedStruct fidl_test_error_ExamplefooRequestTable;
static const struct FidlStructElement Fields33fidl_test_error_ExamplefooRequest[] = {
    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=16u, .field_type=(fidl_type_t*)(&String4294967295nonnullableTable)}}
};
const struct FidlCodedStruct fidl_test_error_ExamplefooRequestTable = {.tag=kFidlTypeStruct, .elements=Fields33fidl_test_error_ExamplefooRequest, .element_count=1u, .size=32u, .name="fidl.test.error/ExamplefooRequest"};

extern const struct FidlCodedStruct fidl_test_error_ExamplefooResponseTable;
static const struct FidlStructElement Fields34fidl_test_error_ExamplefooResponse[] = {
    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=16u, .field_type=(fidl_type_t*)(&fidl_test_error_Example_foo_ResultTable)}}
};
const struct FidlCodedStruct fidl_test_error_ExamplefooResponseTable = {.tag=kFidlTypeStruct, .elements=Fields34fidl_test_error_ExamplefooResponse, .element_count=1u, .size=40u, .name="fidl.test.error/ExamplefooResponse"};


const struct FidlCodedStruct fidl_test_error_Example_foo_ResponseTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=8u, .name="fidl.test.error/Example_foo_Response"};

static const struct FidlXUnionField Fields34fidl_test_error_Example_foo_Result[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_test_error_Example_foo_ResponseTable)},
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table)}
};
const struct FidlCodedXUnion fidl_test_error_Example_foo_ResultTable = {.tag=kFidlTypeXUnion, .field_count=2u, .fields=Fields34fidl_test_error_Example_foo_Result, .nullable=kFidlNullability_Nonnullable, .name="fidl.test.error/Example_foo_Result", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields45fidl_test_error_Example_foo_ResultNullableRef[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_test_error_Example_foo_ResponseTable)},
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table)}
};
const struct FidlCodedXUnion fidl_test_error_Example_foo_ResultNullableRefTable = {.tag=kFidlTypeXUnion, .field_count=2u, .fields=Fields45fidl_test_error_Example_foo_ResultNullableRef, .nullable=kFidlNullability_Nullable, .name="fidl.test.error/Example_foo_Result", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
