// 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 ZXTEST_BASE_LOG_SINK_H_
#define ZXTEST_BASE_LOG_SINK_H_

#include <cstdio>

#include <lib/fit/function.h>
#include <zircon/compiler.h>

namespace zxtest {

// This class provides an abstraction for writing log messages. This allow
// redirecting the output of the reporter on runtime, or even supressing it.
class LogSink {
 public:
  LogSink(const LogSink&) = delete;
  LogSink(LogSink&&) = delete;
  LogSink& operator=(const LogSink&) = delete;
  LogSink& operator=(LogSink&&) = delete;
  virtual ~LogSink() = default;

  // Writes the formatted string to some place defined by the specific implementation.
  virtual void Write(const char* format, ...) __PRINTFLIKE(2, 3) = 0;

  // Flushes the contents to a persistent or final location. Some implementations may choose to
  // optionally flush the contents under certain conditions.
  virtual void Flush() = 0;

 protected:
  LogSink() = default;
};

// Represents a LogSink that writes to a |FILE*| stream.
class FileLogSink final : public LogSink {
 public:
  // Constructs a LogSink that writes to |stream|. If |stream| is nullptr then the outputs are
  // silenced.
  // This constructor assumes that |stream| is owned by the caller.
  explicit FileLogSink(FILE* stream);

  // Constructs a LogSink that writes to |stream|. If |stream| is nullptr then the outputs are
  // silenced.
  // This constructor takes ownership of |stream|, and will call |close_fn(stream)| on destruction.
  FileLogSink(FILE* stream, fit::function<void(FILE*)> close_fn);
  FileLogSink(const FileLogSink&) = delete;
  FileLogSink(FileLogSink&&) = delete;
  FileLogSink& operator=(const FileLogSink&) = delete;
  FileLogSink& operator=(FileLogSink&&) = delete;
  ~FileLogSink() final;

  // Writes |format| to the underlying |stream_|.
  void Write(const char* format, ...) final __PRINTFLIKE(2, 3);

  // Flushes the contents of the buffered for |stream_|.
  void Flush() final;

 protected:
  FILE* stream_ = nullptr;
  fit::function<void(FILE*)> stream_closer_ = nullptr;
};

}  // namespace zxtest

#endif  // ZXTEST_BASE_LOG_SINK_H_
