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

// fidl_experiment = output_index_json

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

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

std::ostream& fidl::ostream::Formatter<::test_driveroneway::Payload>::Format(std::ostream& os, const ::test_driveroneway::Payload& value) {
  os << "test_driveroneway::Payload";
  os << "{ ";
  os << "value";
  os << " = " << fidl::ostream::Formatted<uint32_t>(value.value()) << ", ";
  os << "}";
  return os;
}
std::ostream& fidl::ostream::Formatter<::test_driveroneway::OneWaySendRequest>::Format(std::ostream& os, const ::test_driveroneway::OneWaySendRequest& value) {
  os << "test_driveroneway::OneWaySendRequest";
  os << "{ ";
  os << "payload";
  os << " = " << fidl::ostream::Formatted<::test_driveroneway::Payload>(value.payload()) << ", ";
  os << "}";
  return os;
}

namespace test_driveroneway {

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

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

#pragma clang diagnostic pop

}  // namespace test_driveroneway
