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

// fidl_experiment = output_index_json

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

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

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

namespace test_error {

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

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

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

#pragma clang diagnostic pop

}  // namespace test_error
