#ifndef TOOLS_GN_RUST_PROJECT_WRITER_HELPERS_H_
#define TOOLS_GN_RUST_PROJECT_WRITER_HELPERS_H_
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "base/containers/flat_map.h"
#include "build_settings.h"
#include "gn/source_file.h"
#include "gn/target.h"
using CrateIndex = size_t;
using ConfigList = std::vector<std::string>;
using Dependency = std::pair<CrateIndex, std::string>;
using DependencyList = std::vector<Dependency>;
class Crate {
public:
Crate(SourceFile root,
std::vector<SourceDir> extra_include_dirs,
CrateIndex index,
std::string label,
std::string edition)
: root_(root),
extra_include_dirs_(std::move(extra_include_dirs)),
index_(index),
label_(label),
edition_(edition) {}
~Crate() = default;
void AddConfigItem(std::string cfg_item) { configs_.push_back(cfg_item); }
void AddRustenv(std::string key, std::string value) {
rustenv_.emplace(key, value);
}
void AddDependency(CrateIndex index, std::string name) {
deps_.push_back(std::make_pair(index, name));
}
void SetCompilerArgs(std::vector<std::string> args) { compiler_args_ = args; }
void SetCompilerTarget(std::string target) { compiler_target_ = target; }
void SetIsProcMacro(OutputFile proc_macro_dynamic_library) {
proc_macro_dynamic_library_ = proc_macro_dynamic_library;
}
SourceFile& root() { return root_; }
std::vector<SourceDir>& extra_include_dirs() { return extra_include_dirs_; }
CrateIndex index() { return index_; }
const std::string& label() { return label_; }
const std::string& edition() { return edition_; }
ConfigList& configs() { return configs_; }
DependencyList& dependencies() { return deps_; }
const std::vector<std::string>& CompilerArgs() { return compiler_args_; }
const std::optional<std::string>& CompilerTarget() {
return compiler_target_;
}
const std::optional<OutputFile>& proc_macro_path() {
return proc_macro_dynamic_library_;
}
const base::flat_map<std::string, std::string>& rustenv() { return rustenv_; }
private:
SourceFile root_;
std::vector<SourceDir> extra_include_dirs_;
CrateIndex index_;
std::string label_;
std::string edition_;
ConfigList configs_;
DependencyList deps_;
std::optional<std::string> compiler_target_;
std::vector<std::string> compiler_args_;
std::optional<OutputFile> proc_macro_dynamic_library_;
base::flat_map<std::string, std::string> rustenv_;
};
using CrateList = std::vector<Crate>;
void WriteCrates(const BuildSettings* build_settings,
CrateList& crate_list,
std::optional<std::string>& sysroot,
std::ostream& rust_project);
std::vector<std::string> ExtractCompilerArgs(const Target* target);
std::optional<std::string> FindArgValue(const char* arg,
const std::vector<std::string>& args);
std::optional<std::string> FindArgValueAfterPrefix(
const std::string& prefix,
const std::vector<std::string>& args);
std::vector<std::string> FindAllArgValuesAfterPrefix(
const std::string& prefix,
const std::vector<std::string>& args);
#endif