// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "lib/fidl/cpp/internal/logging.h"

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

#ifdef __Fuchsia__

#include <zircon/status.h>

#endif

namespace fidl {
namespace internal {

void ReportEncodingError(const Message& message, const fidl_type_t* type, const char* error_msg,
                         const char* file, int line) {
  char type_name[1024];
  size_t type_name_length = fidl_format_type_name(type, type_name, sizeof(type_name));
  fprintf(stderr,
          "ERROR: [%s(%d)] fidl encoding error: %s. "
          "message: %.*s, %" PRIu32 " bytes, %" PRIu32 " handles\n",
          file, line, error_msg, static_cast<int>(type_name_length), type_name,
          message.bytes().actual(), message.handles().actual());
}

void ReportDecodingError(const Message& message, const fidl_type_t* type, const char* error_msg,
                         const char* file, int line) {
  char type_name[1024];
  size_t type_name_length = fidl_format_type_name(type, type_name, sizeof(type_name));
  fprintf(stderr,
          "ERROR: [%s(%d)] fidl decoding error: %s. "
          "message: %.*s, %" PRIu32 " bytes, %" PRIu32 " handles\n",
          file, line, error_msg, static_cast<int>(type_name_length), type_name,
          message.bytes().actual(), message.handles().actual());
}

void ReportChannelWritingError(const Message& message, const fidl_type_t* type, zx_status_t status,
                               const char* file, int line) {
  char type_name[1024];
  size_t type_name_length = fidl_format_type_name(type, type_name, sizeof(type_name));

#ifdef __Fuchsia__

  fprintf(stderr,
          "ERROR: [%s(%d)] fidl channel writing error: zx_status_t %d (%s). "
          "message: %.*s, %" PRIu32 " bytes, %" PRIu32 " handles\n",
          file, line, status, zx_status_get_string(status), static_cast<int>(type_name_length),
          type_name, message.bytes().actual(), message.handles().actual());

#else

  fprintf(stderr,
          "ERROR: [%s(%d)] fidl channel writing error: zx_status_t %d. "
          "message: %.*s, %" PRIu32 " bytes, %" PRIu32 " handles\n",
          file, line, status, static_cast<int>(type_name_length), type_name,
          message.bytes().actual(), message.handles().actual());

#endif
}

}  // namespace internal
}  // namespace fidl
