// Copyright 2019 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 "src/developer/debug/zxdb/console/commands/verb_stdout.h"

#include "src/developer/debug/zxdb/client/process.h"
#include "src/developer/debug/zxdb/client/target.h"
#include "src/developer/debug/zxdb/console/command.h"
#include "src/developer/debug/zxdb/console/command_utils.h"
#include "src/developer/debug/zxdb/console/console.h"
#include "src/developer/debug/zxdb/console/output_buffer.h"
#include "src/developer/debug/zxdb/console/verbs.h"
#include "src/lib/fxl/strings/string_printf.h"

namespace zxdb {

namespace {

const char kStdoutShortHelp[] = "stdout: Show process output.";

template <typename ContainerType>
std::string OutputContainer(const ContainerType& container) {
  std::string str;
  str.resize(container.size());
  str.insert(str.end(), container.begin(), container.end());
  return str;
}

Err RunVerbStdout(ConsoleContext* context, const Command& cmd) {
  return RunVerbStdio(Verb::kStdout, cmd, context);
}

}  // namespace

VerbRecord GetStdoutVerbRecord() {
  return VerbRecord(&RunVerbStdout, {"stdout"}, kStdoutShortHelp, kStdioHelp,
                    CommandGroup::kProcess);
}

const char kStdioHelp[] =
    R"(stdout | stderr

  Shows the stdout/stderr (depending on the command) for a given process.

  zxdb will store the output of a debugged process in a ring buffer in order to
  have it available after the fact. This is independent on whether the output
  is being silenced by the "show-stdout" setting (Run "get" to see the current
  settings, run "help get" and "help set" for more information on settings).

Examples

  // Shows stdout of the current active process.
  stdout
    This is some stdout output.
    This is another stdout output.

  // Shows stderr of process 2.
  pr 2 stderr
    [ERROR] This is a stderr entry.
)";

Err RunVerbStdio(Verb io_type, const Command& cmd, ConsoleContext* context) {
  FX_DCHECK(io_type == Verb::kStdout || io_type == Verb::kStderr);

  // Only a process can be specified.
  if (Err err = cmd.ValidateNouns({Noun::kProcess}); err.has_error())
    return err;

  const char* io_name = io_type == Verb::kStdout ? "stdout" : "stderr";
  if (!cmd.args().empty()) {
    auto msg = fxl::StringPrintf("\"%s\" takes no parameters.", io_name);
    return Err(ErrType::kInput, std::move(msg));
  }

  if (Err err = AssertRunningTarget(context, io_name, cmd.target()); err.has_error())
    return err;

  Process* process = cmd.target()->GetProcess();
  auto& container = io_type == Verb::kStdout ? process->get_stdout() : process->get_stderr();
  Console::get()->Output(OutputContainer(container));
  return Err();
}

}  // namespace zxdb
