From 538c7f3e180a5f121c6819ad5d9b14f843512f60 Mon Sep 17 00:00:00 2001 From: Maksim Denisov Date: Fri, 28 Feb 2025 16:59:32 +0100 Subject: ArtifactBlob: Return file path --- src/buildtool/common/artifact_blob.cpp | 16 +++++++++++++++- src/buildtool/common/artifact_blob.hpp | 7 +++++++ 2 files changed, 22 insertions(+), 1 deletion(-) (limited to 'src') 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 -#include #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 { + using Result = std::optional; + 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::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 #include #include +#include #include #include #include @@ -111,6 +112,12 @@ class ArtifactBlob final { [[nodiscard]] auto ReadIncrementally(std::size_t chunk_size) const& noexcept -> expected; + /// \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; + /// \brief Set executable permission. void SetExecutable(bool is_executable) noexcept { is_executable_ = is_executable; -- cgit v1.2.3