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

#ifndef SRC_VIRTUALIZATION_LIB_VSH_COMMAND_RUNNER_H_
#define SRC_VIRTUALIZATION_LIB_VSH_COMMAND_RUNNER_H_

#include <fuchsia/virtualization/cpp/fidl.h>
#include <lib/fit/result.h>

#include <string>
#include <unordered_map>
#include <vector>

namespace vsh {

// Enable running commands using vsh.
//
// Each command to be run will have its own vsh connection, which enables all
// stdout/stderr and return code to be captured.
//
// Note that this blocking interface will buffer all stdout/stderr for the
// process until it exits and is not suitable for processes that produce a
// large amount of stdout/stderr output.
class BlockingCommandRunner {
 public:
  BlockingCommandRunner(
      fidl::InterfaceHandle<fuchsia::virtualization::HostVsockEndpoint> socket_endpoint,
      uint32_t cid, uint32_t port = 9001);

  struct Command {
    // The command to be run. The executable must be at argv[0].
    std::vector<std::string> argv;
    // Any environment variables to set for this command execution.
    std::unordered_map<std::string, std::string> env;
  };

  struct CommandResult {
    // The stdout for the process.
    std::string out;
    // The stderr for the process.
    std::string err;
    // The exit code for the process.
    int32_t return_code;
  };

  // Sends a command over vsh to be executed and returns the output.
  //
  // Note this is a blocking API that won't return until the process started
  // by |command| has exited, or the vsh connection has been closed.
  fit::result<CommandResult, zx_status_t> Execute(Command command);

 private:
  fuchsia::virtualization::HostVsockEndpointSyncPtr socket_endpoint_;
  uint32_t cid_;
  uint32_t port_;
};

}  // namespace vsh

#endif  // SRC_VIRTUALIZATION_LIB_VSH_COMMAND_RUNNER_H_
