// 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.

#ifndef LIB_FIDL_CPP_INTERNAL_LOGGING_H_
#define LIB_FIDL_CPP_INTERNAL_LOGGING_H_

#include <lib/fidl/cpp/message.h>

namespace fidl {
namespace internal {

void ReportEncodingError(const HLCPPOutgoingMessage& message, const fidl_type_t* type,
                         const char* error_msg, const char* file, int line);

void ReportDecodingError(const HLCPPIncomingMessage& message, const fidl_type_t* type,
                         const char* error_msg, const char* file, int line);

void ReportChannelWritingError(const HLCPPOutgoingMessage& message, const fidl_type_t* type,
                               zx_status_t status, const char* file, int line);

#define FIDL_REPORT_ENCODING_ERROR(message, type, error_msg) \
  ::fidl::internal::ReportEncodingError((message), (type), (error_msg), __FILE__, __LINE__)

#define FIDL_REPORT_DECODING_ERROR(message, type, error_msg) \
  ::fidl::internal::ReportDecodingError((message), (type), (error_msg), __FILE__, __LINE__)

#define FIDL_REPORT_CHANNEL_WRITING_ERROR(message, type, status) \
  ::fidl::internal::ReportChannelWritingError((message), (type), (status), __FILE__, __LINE__)

}  // namespace internal
}  // namespace fidl

#endif  // LIB_FIDL_CPP_INTERNAL_LOGGING_H_
