// Copyright 2021 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_UTILS_IO_COMMAND_H_
#define SRC_UTILS_IO_COMMAND_H_

#include <string>
#include <utility>

namespace tint {
namespace utils {

/// Command is a helper used by tests for executing a process with a number of
/// arguments and an optional stdin string, and then collecting and returning
/// the process's stdout and stderr output as strings.
class Command {
 public:
  /// Output holds the output of the process
  struct Output {
    /// stdout from the process
    std::string out;
    /// stderr from the process
    std::string err;
    /// process error code
    int error_code = 0;
  };

  /// Constructor
  /// @param path path to the executable
  explicit Command(const std::string& path);

  /// Looks for an executable with the given name in the current working
  /// directory, and if not found there, in each of the directories in the
  /// `PATH` environment variable.
  /// @param executable the executable name
  /// @returns a Command which will return true for Found() if the executable
  /// was found.
  static Command LookPath(const std::string& executable);

  /// @return true if the executable exists at the path provided to the
  /// constructor
  bool Found() const;

  /// @returns the path of the command
  const std::string& Path() const { return path_; }

  /// Invokes the command with the given argument strings, blocking until the
  /// process has returned.
  /// @param args the string arguments to pass to the process
  /// @returns the process output
  template <typename... ARGS>
  Output operator()(ARGS... args) const {
    return Exec({std::forward<ARGS>(args)...});
  }

  /// Exec invokes the command with the given argument strings, blocking until
  /// the process has returned.
  /// @param args the string arguments to pass to the process
  /// @returns the process output
  Output Exec(std::initializer_list<std::string> args) const;

  /// @param input the input data to pipe to the process's stdin
  void SetInput(const std::string& input) { input_ = input; }

 private:
  std::string const path_;
  std::string input_;
};

}  // namespace utils
}  // namespace tint

#endif  //  SRC_UTILS_IO_COMMAND_H_
