summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/common/artifact_blob.cpp16
-rw-r--r--src/buildtool/common/artifact_blob.hpp7
2 files changed, 22 insertions, 1 deletions
diff --git a/src/buildtool/common/artifact_blob.cpp b/src/buildtool/common/artifact_blob.cpp
index 8c48d34e..c46e54c6 100644
--- a/src/buildtool/common/artifact_blob.cpp
+++ b/src/buildtool/common/artifact_blob.cpp
@@ -15,7 +15,6 @@
#include "src/buildtool/common/artifact_blob.hpp"
#include <exception>
-#include <optional>
#include "fmt/core.h"
#include "src/buildtool/common/artifact_digest_factory.hpp"
@@ -202,6 +201,21 @@ auto ArtifactBlob::ReadIncrementally(std::size_t chunk_size) const& noexcept
}
}
+auto ArtifactBlob::GetFilePath() const& noexcept
+ -> std::optional<std::filesystem::path> {
+ using Result = std::optional<std::filesystem::path>;
+ static constexpr InPlaceVisitor kVisitor{
+ [](InMemory const&) -> Result { return std::nullopt; },
+ [](InFile const& value) -> Result { return value; },
+ [](InTempFile const& value) -> Result { return value->GetPath(); },
+ };
+ try {
+ return std::visit(kVisitor, content_);
+ } catch (...) {
+ return std::nullopt;
+ }
+}
+
namespace std {
auto hash<ArtifactBlob>::operator()(ArtifactBlob const& blob) const noexcept
-> std::size_t {
diff --git a/src/buildtool/common/artifact_blob.hpp b/src/buildtool/common/artifact_blob.hpp
index 1e54f71b..1847e536 100644
--- a/src/buildtool/common/artifact_blob.hpp
+++ b/src/buildtool/common/artifact_blob.hpp
@@ -19,6 +19,7 @@
#include <filesystem>
#include <functional>
#include <memory>
+#include <optional>
#include <string>
#include <utility>
#include <variant>
@@ -111,6 +112,12 @@ class ArtifactBlob final {
[[nodiscard]] auto ReadIncrementally(std::size_t chunk_size) const& noexcept
-> expected<IncrementalReader, std::string>;
+ /// \brief Obtain the path to the file that is used as the content source.
+ /// If ArtifactBlob doesn't use a filesystem source or an internal error
+ /// occurs, std::nullopt is returned.
+ [[nodiscard]] auto GetFilePath() const& noexcept
+ -> std::optional<std::filesystem::path>;
+
/// \brief Set executable permission.
void SetExecutable(bool is_executable) noexcept {
is_executable_ = is_executable;