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

// fidl_experiment = output_index_json

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

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

size_t fidl::internal::DisplayError<::test_enum::MyStrictEnum>::Format(
    const ::test_enum::MyStrictEnum& value, char* destination, size_t capacity) {
  const char* member_name = [&]() -> const char* {
    switch (static_cast<uint32_t>(value)) {
      case 1u:
        return "FOO";
      case 2u:
        return "BAR";
      default:
        return "[UNKNOWN]";
    }
  }();
  size_t written = std::snprintf(destination, capacity, "%s.%s (value: %u)",
                                 "test.enum/MyStrictEnum", member_name, static_cast<uint32_t>(value));
  return std::min(written, capacity - 1);
}

size_t fidl::internal::DisplayError<::test_enum::MyFlexibleEnum>::Format(
    const ::test_enum::MyFlexibleEnum& value, char* destination, size_t capacity) {
  const char* member_name = [&]() -> const char* {
    switch (static_cast<uint32_t>(value)) {
      case 1u:
        return "FOO";
      case 2u:
        return "BAR";
      default:
        return "[UNKNOWN]";
    }
  }();
  size_t written = std::snprintf(destination, capacity, "%s.%s (value: %u)",
                                 "test.enum/MyFlexibleEnum", member_name, static_cast<uint32_t>(value));
  return std::min(written, capacity - 1);
}

size_t fidl::internal::DisplayError<::test_enum::MyFlexibleEnumWithCustomUnknown>::Format(
    const ::test_enum::MyFlexibleEnumWithCustomUnknown& value, char* destination, size_t capacity) {
  const char* member_name = [&]() -> const char* {
    switch (static_cast<uint32_t>(value)) {
      case 1u:
        return "FOO";
      case 2u:
        return "BAR";
      case 3u:
        return "CUSTOM_UNKNOWN";
      default:
        return "[UNKNOWN]";
    }
  }();
  size_t written = std::snprintf(destination, capacity, "%s.%s (value: %u)",
                                 "test.enum/MyFlexibleEnumWithCustomUnknown", member_name, static_cast<uint32_t>(value));
  return std::min(written, capacity - 1);
}

size_t fidl::internal::DisplayError<::test_enum::MyEmptyFlexibleEnum>::Format(
    const ::test_enum::MyEmptyFlexibleEnum& value, char* destination, size_t capacity) {
  const char* member_name = [&]() -> const char* {
    switch (static_cast<uint32_t>(value)) {
      default:
        return "[UNKNOWN]";
    }
  }();
  size_t written = std::snprintf(destination, capacity, "%s.%s (value: %u)",
                                 "test.enum/MyEmptyFlexibleEnum", member_name, static_cast<uint32_t>(value));
  return std::min(written, capacity - 1);
}

#pragma clang diagnostic pop
