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

// fidl_experiment = output_index_json

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

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

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_driverhandle::ClientEndWrapper>::Format(std::ostream& os, const ::test_driverhandle::ClientEndWrapper& value) {
  os << "test_driverhandle::ClientEndWrapper";
  os << "{ ";
  os << "value";
  os << " = " << fidl::ostream::Formatted<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>>(value.value()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_driverhandle::ServerEndWrapper>::Format(std::ostream& os, const ::test_driverhandle::ServerEndWrapper& value) {
  os << "test_driverhandle::ServerEndWrapper";
  os << "{ ";
  os << "value";
  os << " = " << fidl::ostream::Formatted<::fdf::ServerEnd<::test_driverhandle::DriverProtocol>>(value.value()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_driverhandle::HandlesInProtocolSendHandlesRequest>::Format(std::ostream& os, const ::test_driverhandle::HandlesInProtocolSendHandlesRequest& value) {
  os << "test_driverhandle::HandlesInProtocolSendHandlesRequest";
  os << "{ ";
  os << "t";
  os << " = " << fidl::ostream::Formatted<::test_driverhandle::T>(value.t()) << ", ";
  os << "}";
  return os;
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

std::ostream& fidl::ostream::Formatter<::test_driverhandle::T>::Format(std::ostream& os, const ::test_driverhandle::T& value) {
  os << "test_driverhandle::T";
  os << "{ ";
  if (value.zircon_handle().has_value()) {
    os << "zircon_handle";
    os << " = " << fidl::ostream::Formatted<::zx::event>(value.zircon_handle().value()) << ", ";
  }
  if (value.fdf_handle().has_value()) {
    os << "fdf_handle";
    os << " = " << fidl::ostream::Formatted<::fdf::ClientEnd<::test_driverhandle::DriverProtocol>>(value.fdf_handle().value()) << ", ";
  }
  os << "}";
  return os;
}

#endif  // __Fuchsia__

namespace test_driverhandle {

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#ifdef __Fuchsia__

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

#endif  // __Fuchsia__

#pragma clang diagnostic pop

}  // namespace test_driverhandle
