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

// fidl_experiment = output_index_json

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

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

std::ostream& fidl::ostream::Formatter<::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest>::Format(std::ostream& os, const ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest& value) {
  os << "test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleRequest";
  os << "{ ";
  os << "s";
  os << " = " << fidl::ostream::Formatted<::test_requestflexibleenvelope::StrictFoo>(value.s()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse>::Format(std::ostream& os, const ::test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse& value) {
  os << "test_requestflexibleenvelope::ProtocolRequestStrictResponseFlexibleResponse";
  os << "{ ";
  os << "f";
  os << " = " << fidl::ostream::Formatted<::test_requestflexibleenvelope::FlexibleFoo>(value.f()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest>::Format(std::ostream& os, const ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest& value) {
  os << "test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictRequest";
  os << "{ ";
  os << "s";
  os << " = " << fidl::ostream::Formatted<::test_requestflexibleenvelope::FlexibleFoo>(value.s()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse>::Format(std::ostream& os, const ::test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse& value) {
  os << "test_requestflexibleenvelope::ProtocolRequestFlexibleResponseStrictResponse";
  os << "{ ";
  os << "f";
  os << " = " << fidl::ostream::Formatted<::test_requestflexibleenvelope::StrictFoo>(value.f()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_requestflexibleenvelope::FlexibleFoo>::Format(std::ostream& os, const ::test_requestflexibleenvelope::FlexibleFoo& value) {
  os << "test_requestflexibleenvelope::FlexibleFoo::";
  switch (value.Which()) {
    case ::test_requestflexibleenvelope::FlexibleFoo::Tag::kS:
      os << "s(" << fidl::ostream::Formatted<::std::string>(value.s().value()) << ")";
      break;
    case ::test_requestflexibleenvelope::FlexibleFoo::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int32_t>(value.i().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_requestflexibleenvelope::StrictFoo>::Format(std::ostream& os, const ::test_requestflexibleenvelope::StrictFoo& value) {
  os << "test_requestflexibleenvelope::StrictFoo::";
  switch (value.Which()) {
    case ::test_requestflexibleenvelope::StrictFoo::Tag::kS:
      os << "s(" << fidl::ostream::Formatted<::std::string>(value.s().value()) << ")";
      break;
    case ::test_requestflexibleenvelope::StrictFoo::Tag::kI:
      os << "i(" << fidl::ostream::Formatted<int32_t>(value.i().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}

namespace test_requestflexibleenvelope {

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

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

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

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

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

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

#pragma clang diagnostic pop

}  // namespace test_requestflexibleenvelope
