summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaksim Denisov <denisov.maksim@huawei.com>2025-02-25 15:01:35 +0100
committerMaksim Denisov <denisov.maksim@huawei.com>2025-02-27 09:03:30 +0100
commit9ef9974db0941587453891e3250ffed8de7e10f1 (patch)
treed91ce04143e6a246ab25cb80997ebe451134ade5
parenta5e3bc0b304e87e06865f0558acf88995d466b7c (diff)
downloadjustbuild-9ef9974db0941587453891e3250ffed8de7e10f1.tar.gz
ArtifactBlob: Allow different content sources
-rw-r--r--src/buildtool/common/TARGETS1
-rw-r--r--src/buildtool/common/artifact_blob.cpp32
-rw-r--r--src/buildtool/common/artifact_blob.hpp8
3 files changed, 35 insertions, 6 deletions
diff --git a/src/buildtool/common/TARGETS b/src/buildtool/common/TARGETS
index 33e88829..40539325 100644
--- a/src/buildtool/common/TARGETS
+++ b/src/buildtool/common/TARGETS
@@ -95,6 +95,7 @@
[ "artifact_digest_factory"
, ["@", "fmt", "", "fmt"]
, ["src/utils/cpp", "hash_combine"]
+ , ["src/utils/cpp", "in_place_visitor"]
]
, "stage": ["src", "buildtool", "common"]
}
diff --git a/src/buildtool/common/artifact_blob.cpp b/src/buildtool/common/artifact_blob.cpp
index c25e1db1..78a9d54e 100644
--- a/src/buildtool/common/artifact_blob.cpp
+++ b/src/buildtool/common/artifact_blob.cpp
@@ -19,6 +19,7 @@
#include "fmt/core.h"
#include "src/buildtool/common/artifact_digest_factory.hpp"
#include "src/utils/cpp/hash_combine.hpp"
+#include "src/utils/cpp/in_place_visitor.hpp"
auto ArtifactBlob::FromMemory(HashFunction hash_function,
ObjectType type,
@@ -45,16 +46,39 @@ auto ArtifactBlob::FromMemory(HashFunction hash_function,
auto ArtifactBlob::ReadContent() const noexcept
-> std::shared_ptr<std::string const> {
- return content_;
+ using Result = std::shared_ptr<std::string const>;
+ static constexpr InPlaceVisitor kVisitor{
+ [](InMemory const& value) -> Result { return value; },
+ };
+ try {
+ return std::visit(kVisitor, content_);
+ } catch (...) {
+ return nullptr;
+ }
}
auto ArtifactBlob::ReadIncrementally(std::size_t chunk_size) const& noexcept
-> expected<IncrementalReader, std::string> {
- if (content_ == nullptr) {
+ using Result = expected<IncrementalReader, std::string>;
+ const InPlaceVisitor visitor{
+ [chunk_size](InMemory const& value) -> Result {
+ if (value == nullptr) {
+ return unexpected<std::string>{
+ "ArtifactBlob::ReadIncrementally: missing memory source"};
+ }
+ return IncrementalReader::FromMemory(chunk_size, value.get());
+ },
+ };
+ try {
+ return std::visit(visitor, content_);
+ } catch (std::exception const& e) {
+ return unexpected{fmt::format(
+ "ArtifactBlob::ReadIncrementally: Got an exception:\n{}",
+ e.what())};
+ } catch (...) {
return unexpected<std::string>{
- "ArtifactBlob::ReadIncrementally: missing memory source"};
+ "ArtifactBlob::ReadIncrementally: Got an unknown exception"};
}
- return IncrementalReader::FromMemory(chunk_size, content_.get());
}
namespace std {
diff --git a/src/buildtool/common/artifact_blob.hpp b/src/buildtool/common/artifact_blob.hpp
index 800b78c1..c5a03cf9 100644
--- a/src/buildtool/common/artifact_blob.hpp
+++ b/src/buildtool/common/artifact_blob.hpp
@@ -20,6 +20,7 @@
#include <memory>
#include <string>
#include <utility>
+#include <variant>
#include "src/buildtool/common/artifact_digest.hpp"
#include "src/buildtool/crypto/hash_function.hpp"
@@ -79,12 +80,15 @@ class ArtifactBlob final {
}
private:
+ using InMemory = std::shared_ptr<std::string const>;
+ using ContentSource = std::variant<InMemory>;
+
ArtifactDigest digest_;
- std::shared_ptr<std::string const> content_;
+ ContentSource content_;
bool is_executable_;
explicit ArtifactBlob(ArtifactDigest digest,
- std::shared_ptr<std::string const> content,
+ ContentSource content,
bool is_executable) noexcept
: digest_{std::move(digest)},
content_{std::move(content)},