// Copyright (c) 2013 The Chromium 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 TOOLS_GN_NINJA_WRITER_H_
#define TOOLS_GN_NINJA_WRITER_H_

#include <map>
#include <set>
#include <string>
#include <vector>

class Builder;
class BuildSettings;
class Err;
class Target;
class Toolchain;

class NinjaWriter {
 public:
  // Combines a target and the computed build rule for it.
  using TargetRulePair = std::pair<const Target*, std::string>;

  // Associates the build rules with each toolchain.
  using PerToolchainRules =
      std::map<const Toolchain*, std::vector<TargetRulePair>>;

  // On failure will populate |err| and will return false.  The map contains
  // the per-toolchain set of rules collected to write to the toolchain build
  // files.
  static bool RunAndWriteFiles(const BuildSettings* build_settings,
                               const Builder& builder,
                               const PerToolchainRules& per_toolchain_rules,
                               Err* err);

 private:
  NinjaWriter(const Builder& builder);
  ~NinjaWriter();

  bool WriteToolchains(const PerToolchainRules& per_toolchain_rules, Err* err);

  const Builder& builder_;

  NinjaWriter(const NinjaWriter&) = delete;
  NinjaWriter& operator=(const NinjaWriter&) = delete;
};

#endif  // TOOLS_GN_NINJA_WRITER_H_
