diff options
Diffstat (limited to 'src/buildtool/execution_api/common/bytestream_utils.hpp')
-rw-r--r-- | src/buildtool/execution_api/common/bytestream_utils.hpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/common/bytestream_utils.hpp b/src/buildtool/execution_api/common/bytestream_utils.hpp index c28c9627..9b46073f 100644 --- a/src/buildtool/execution_api/common/bytestream_utils.hpp +++ b/src/buildtool/execution_api/common/bytestream_utils.hpp @@ -16,11 +16,51 @@ #define INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_BYTESTREAM_UTILS_HPP #include <cstddef> +#include <cstdint> +#include <optional> +#include <string> + +namespace build::bazel::remote::execution::v2 { +class Digest; +} +namespace bazel_re = build::bazel::remote::execution::v2; class ByteStreamUtils final { + static constexpr auto* kBlobs = "blobs"; + public: // Chunk size for uploads (default size used by BuildBarn) static constexpr std::size_t kChunkSize = 64 * 1024; + + /// \brief Create a read request for the bytestream service to be + /// transferred over the net. Handles serialization/deserialization on its + /// own. The pattern is: + /// "{instance_name}/{kBlobs}/{digest.hash()}/{digest.size_bytes()}". + /// "instance_name_example/blobs/62183d7a696acf7e69e218efc82c93135f8c85f895/4424712" + class ReadRequest final { + public: + explicit ReadRequest(std::string instance_name, + bazel_re::Digest const& digest) noexcept; + + [[nodiscard]] auto ToString() && noexcept -> std::string; + + [[nodiscard]] static auto FromString( + std::string const& request) noexcept -> std::optional<ReadRequest>; + + [[nodiscard]] auto GetInstanceName() const noexcept + -> std::string const& { + return instance_name_; + } + + [[nodiscard]] auto GetDigest() const noexcept -> bazel_re::Digest; + + private: + std::string instance_name_; + std::string hash_; + std::int64_t size_ = 0; + + ReadRequest() = default; + }; }; #endif // INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_BYTESTREAM_UTILS_HPP |