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

#include <fidl/test.enum/cpp/common_types.h>

namespace test_enum {
extern "C" const fidl_type_t test_enum_MyStrictEnumTable;
}  // namespace test_enum
size_t fidl::internal::DisplayError<::test_enum::MyStrictEnum>::Format(
    const ::test_enum::MyStrictEnum& value, char* destination, size_t capacity) {
  const char* name = [&]() -> const char* {
    switch (static_cast<uint32_t>(value)) {
      case 1u:
        return "FOO";
      case 2u:
        return "BAR";
      default:
        return nullptr;
    }
  }();
  return ::fidl::internal::FormatApplicationError(
      static_cast<uint32_t>(value), name, &::test_enum::test_enum_MyStrictEnumTable, destination, capacity);
}

namespace test_enum {
extern "C" const fidl_type_t test_enum_MyFlexibleEnumWithCustomUnknownTable;
}  // namespace test_enum
size_t fidl::internal::DisplayError<::test_enum::MyFlexibleEnumWithCustomUnknown>::Format(
    const ::test_enum::MyFlexibleEnumWithCustomUnknown& value, char* destination, size_t capacity) {
  const char* name = [&]() -> const char* {
    switch (static_cast<uint32_t>(value)) {
      case 1u:
        return "FOO";
      case 2u:
        return "BAR";
      case 3u:
        return "CUSTOM_UNKNOWN";
      default:
        return nullptr;
    }
  }();
  return ::fidl::internal::FormatApplicationError(
      static_cast<uint32_t>(value), name, &::test_enum::test_enum_MyFlexibleEnumWithCustomUnknownTable, destination, capacity);
}

namespace test_enum {
extern "C" const fidl_type_t test_enum_MyFlexibleEnumTable;
}  // namespace test_enum
size_t fidl::internal::DisplayError<::test_enum::MyFlexibleEnum>::Format(
    const ::test_enum::MyFlexibleEnum& value, char* destination, size_t capacity) {
  const char* name = [&]() -> const char* {
    switch (static_cast<uint32_t>(value)) {
      case 1u:
        return "FOO";
      case 2u:
        return "BAR";
      default:
        return nullptr;
    }
  }();
  return ::fidl::internal::FormatApplicationError(
      static_cast<uint32_t>(value), name, &::test_enum::test_enum_MyFlexibleEnumTable, destination, capacity);
}

namespace test_enum {
extern "C" const fidl_type_t test_enum_MyEmptyFlexibleEnumTable;
}  // namespace test_enum
size_t fidl::internal::DisplayError<::test_enum::MyEmptyFlexibleEnum>::Format(
    const ::test_enum::MyEmptyFlexibleEnum& value, char* destination, size_t capacity) {
  const char* name = [&]() -> const char* {
    switch (static_cast<uint32_t>(value)) {
      default:
        return nullptr;
    }
  }();
  return ::fidl::internal::FormatApplicationError(
      static_cast<uint32_t>(value), name, &::test_enum::test_enum_MyEmptyFlexibleEnumTable, destination, capacity);
}
