summaryrefslogtreecommitdiff
path: root/src/buildtool/common/tree.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/common/tree.hpp')
-rw-r--r--src/buildtool/common/tree.hpp72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/buildtool/common/tree.hpp b/src/buildtool/common/tree.hpp
new file mode 100644
index 00000000..512eda86
--- /dev/null
+++ b/src/buildtool/common/tree.hpp
@@ -0,0 +1,72 @@
+#ifndef INCLUDED_SRC_BUILDTOOL_COMMON_TREE_HPP
+#define INCLUDED_SRC_BUILDTOOL_COMMON_TREE_HPP
+
+#include <string>
+#include <unordered_map>
+
+#include "nlohmann/json.hpp"
+#include "src/buildtool/common/action_description.hpp"
+#include "src/buildtool/common/artifact_description.hpp"
+
+// Describes tree, its inputs, output (tree artifact), and action (tree action).
+class Tree {
+ using inputs_t = ActionDescription::inputs_t;
+
+ public:
+ explicit Tree(inputs_t&& inputs)
+ : id_{ComputeId(inputs)}, inputs_{std::move(inputs)} {}
+
+ [[nodiscard]] auto Id() const& -> std::string const& { return id_; }
+ [[nodiscard]] auto Id() && -> std::string { return std::move(id_); }
+
+ [[nodiscard]] auto ToJson() const -> nlohmann::json {
+ return ComputeDescription(inputs_);
+ }
+
+ [[nodiscard]] auto Inputs() const -> inputs_t { return inputs_; }
+
+ [[nodiscard]] auto Action() const -> ActionDescription {
+ return {
+ {/*unused*/}, {/*unused*/}, Action::CreateTreeAction(id_), inputs_};
+ }
+
+ [[nodiscard]] auto Output() const -> ArtifactDescription {
+ return ArtifactDescription{id_};
+ }
+
+ [[nodiscard]] static auto FromJson(std::string const& id,
+ nlohmann::json const& json)
+ -> std::optional<Tree> {
+ auto inputs = inputs_t{};
+ inputs.reserve(json.size());
+ for (auto const& [path, artifact] : json.items()) {
+ auto artifact_desc = ArtifactDescription::FromJson(artifact);
+ if (not artifact_desc) {
+ return std::nullopt;
+ }
+ inputs.emplace(path, std::move(*artifact_desc));
+ }
+ return Tree{id, std::move(inputs)};
+ }
+
+ private:
+ std::string id_;
+ inputs_t inputs_;
+
+ Tree(std::string id, inputs_t&& inputs)
+ : id_{std::move(id)}, inputs_{std::move(inputs)} {}
+
+ static auto ComputeDescription(inputs_t const& inputs) -> nlohmann::json {
+ auto json = nlohmann::json::object();
+ for (auto const& [path, artifact] : inputs) {
+ json[path] = artifact.ToJson();
+ }
+ return json;
+ }
+
+ static auto ComputeId(inputs_t const& inputs) -> std::string {
+ return ComputeHash(ComputeDescription(inputs).dump());
+ }
+};
+
+#endif // INCLUDED_SRC_BUILDTOOL_COMMON_TREE_HPP