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

#include <lib/fidl/internal.h>


extern const struct FidlCodedBits fidl_test_bindingsdenylist_OnlySyzkallerTable;
extern const struct FidlCodedTable fidl_test_bindingsdenylist_OnlyRustTable;
extern const struct FidlCodedXUnion fidl_test_bindingsdenylist_OnlyLlcppTable;
extern const struct FidlCodedXUnion fidl_test_bindingsdenylist_OnlyLlcppNullableRefTable;
extern const struct FidlCodedStruct fidl_test_bindingsdenylist_OnlyGoTable;
extern const struct FidlCodedEnum fidl_test_bindingsdenylist_OnlyDartTable;


extern const struct FidlCodedStruct fidl_test_bindingsdenylist_OnlyLibfuzzerAndDepsLibfuzzerNeedsNonemptyProtocolRequestTable;
const struct FidlCodedStruct fidl_test_bindingsdenylist_OnlyLibfuzzerAndDepsLibfuzzerNeedsNonemptyProtocolRequestTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=16u, .name="fidl.test.bindingsdenylist/OnlyLibfuzzerAndDepsLibfuzzerNeedsNonemptyProtocolRequest"};

extern const struct FidlCodedStruct fidl_test_bindingsdenylist_OnlyLibfuzzerAndDepsLibfuzzerNeedsNonemptyProtocolResponseTable;
const struct FidlCodedStruct fidl_test_bindingsdenylist_OnlyLibfuzzerAndDepsLibfuzzerNeedsNonemptyProtocolResponseTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=16u, .name="fidl.test.bindingsdenylist/OnlyLibfuzzerAndDepsLibfuzzerNeedsNonemptyProtocolResponse"};


const struct FidlCodedBits fidl_test_bindingsdenylist_OnlySyzkallerTable = {.tag=kFidlTypeBits, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .mask=1ul, .name="fidl.test.bindingsdenylist/OnlySyzkaller"};

const struct FidlCodedTable fidl_test_bindingsdenylist_OnlyRustTable = {.tag=kFidlTypeTable, .fields=NULL, .field_count=0u, .is_resource=kFidlIsResource_NotResource, .name="fidl.test.bindingsdenylist/OnlyRust"};

static const struct FidlXUnionField Fields36fidl_test_bindingsdenylist_OnlyLlcpp[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table)}
};
const struct FidlCodedXUnion fidl_test_bindingsdenylist_OnlyLlcppTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields36fidl_test_bindingsdenylist_OnlyLlcpp, .nullable=kFidlNullability_Nonnullable, .name="fidl.test.bindingsdenylist/OnlyLlcpp", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields47fidl_test_bindingsdenylist_OnlyLlcppNullableRef[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table)}
};
const struct FidlCodedXUnion fidl_test_bindingsdenylist_OnlyLlcppNullableRefTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields47fidl_test_bindingsdenylist_OnlyLlcppNullableRef, .nullable=kFidlNullability_Nullable, .name="fidl.test.bindingsdenylist/OnlyLlcpp", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
const struct FidlCodedStruct fidl_test_bindingsdenylist_OnlyGoTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=1u, .name="fidl.test.bindingsdenylist/OnlyGo"};

static bool EnumValidatorFor_fidl_test_bindingsdenylist_OnlyDart(uint64_t v) {
  switch (v) {
    case 1ul:
      return true;
    default:
      return false;
  }
}

const struct FidlCodedEnum fidl_test_bindingsdenylist_OnlyDartTable = {.tag=kFidlTypeEnum, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .validate=&EnumValidatorFor_fidl_test_bindingsdenylist_OnlyDart, .name="fidl.test.bindingsdenylist/OnlyDart"};

