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

// fidl_experiment = output_index_json

#include <fidl/test.errorsyntax/cpp/natural_ostream.h>

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

std::ostream& fidl::ostream::Formatter<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest>::Format(std::ostream& os, const ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest& value) {
  os << "test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest";
  os << "{ ";
  os << "s";
  os << " = " << fidl::ostream::Formatted<::std::string>(value.s()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResponse>::Format(std::ostream& os, const ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResponse& value) {
  os << "test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResponse";
  os << "{ ";
  os << "value";
  os << " = " << fidl::ostream::Formatted<int64_t>(value.value()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult>::Format(std::ostream& os, const ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult& value) {
  os << "test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult::";
  switch (value.Which()) {
    case ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResponse>(value.response().value()) << ")";
      break;
    case ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}

namespace test_errorsyntax {

std::ostream& operator<<(std::ostream& os, const ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest& value) {
  return fidl::ostream::Formatter<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailRequest>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResponse& value) {
  return fidl::ostream::Formatter<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResponse>::Format(os, value);
}

std::ostream& operator<<(std::ostream& os, const ::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult& value) {
  return fidl::ostream::Formatter<::test_errorsyntax::ExampleUseOfErrorSyntaxCallWhichMayFailResult>::Format(os, value);
}

#pragma clang diagnostic pop

}  // namespace test_errorsyntax
