diff options
author | Maksim Denisov <denisov.maksim@huawei.com> | 2025-02-25 15:01:35 +0100 |
---|---|---|
committer | Maksim Denisov <denisov.maksim@huawei.com> | 2025-02-27 09:03:30 +0100 |
commit | 9ef9974db0941587453891e3250ffed8de7e10f1 (patch) | |
tree | d91ce04143e6a246ab25cb80997ebe451134ade5 | |
parent | a5e3bc0b304e87e06865f0558acf88995d466b7c (diff) | |
download | justbuild-9ef9974db0941587453891e3250ffed8de7e10f1.tar.gz |
ArtifactBlob: Allow different content sources
-rw-r--r-- | src/buildtool/common/TARGETS | 1 | ||||
-rw-r--r-- | src/buildtool/common/artifact_blob.cpp | 32 | ||||
-rw-r--r-- | src/buildtool/common/artifact_blob.hpp | 8 |
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)}, |