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

// fidl_experiment = output_index_json

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

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

std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyDartRequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<bool>(value.a()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResponse>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResponse& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyDartResponse";
  os << "{ ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int32_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyGoRequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<bool>(value.a()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResponse>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResponse& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyGoResponse";
  os << "{ ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int32_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerRequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<bool>(value.a()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResponse>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResponse& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResponse";
  os << "{ ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int32_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyRustRequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<bool>(value.a()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResponse>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResponse& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyRustResponse";
  os << "{ ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int32_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerRequest";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<bool>(value.a()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResponse>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResponse& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResponse";
  os << "{ ";
  os << "b";
  os << " = " << fidl::ostream::Formatted<int32_t>(value.b()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary>::Format(std::ostream& os, const ::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary& value) {
  os << "test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary";
  os << "{ ";
  os << "a";
  os << " = " << fidl::ostream::Formatted<bool>(value.a()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::OnlyAppearsInImportingLibrary>::Format(std::ostream& os, const ::test_bindingsdenylist::OnlyAppearsInImportingLibrary& value) {
  os << "test_bindingsdenylist::OnlyAppearsInImportingLibrary";
  os << "{ ";
  os << "member_only_appears_in_importing_library";
  os << " = " << fidl::ostream::Formatted<::test_bindingsdenylist::MemberOnlyAppearsInImportingLibrary>(value.member_only_appears_in_importing_library()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::OnlyLlcpp>::Format(std::ostream& os, const ::test_bindingsdenylist::OnlyLlcpp& value) {
  os << "test_bindingsdenylist::OnlyLlcpp::";
  switch (value.Which()) {
    case ::test_bindingsdenylist::OnlyLlcpp::Tag::kX:
      os << "x(" << fidl::ostream::Formatted<uint32_t>(value.x().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult::";
  switch (value.Which()) {
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResponse>(value.response().value()) << ")";
      break;
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenyDartResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult::";
  switch (value.Which()) {
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResponse>(value.response().value()) << ")";
      break;
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenyGoResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult::";
  switch (value.Which()) {
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResponse>(value.response().value()) << ")";
      break;
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenyLibfuzzerResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult::";
  switch (value.Which()) {
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResponse>(value.response().value()) << ")";
      break;
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenyRustResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult>::Format(std::ostream& os, const ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult& value) {
  os << "test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult::";
  switch (value.Which()) {
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult::Tag::kResponse:
      os << "response(" << fidl::ostream::Formatted<::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResponse>(value.response().value()) << ")";
      break;
    case ::test_bindingsdenylist::DenyEachBindingOnlyDenySyzkallerResult::Tag::kErr:
      os << "err(" << fidl::ostream::Formatted<uint32_t>(value.err().value()) << ")";
      break;
    default:
      os << "Unknown";
  }
  return os;
}

namespace test_bindingsdenylist {

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#pragma clang diagnostic pop

}  // namespace test_bindingsdenylist
