From ecd15732579c5a6d0ed107b0103e2d39ebb8ec66 Mon Sep 17 00:00:00 2001 From: Nikolai Vladimirov Date: Sat, 5 Jul 2025 18:30:04 +0000 Subject: [PATCH] Call prepare_done function to form response --- include/boost/redis/adapter/any_adapter.hpp | 1 + .../boost/redis/adapter/detail/adapters.hpp | 18 ++++++++++++++++++ include/boost/redis/response.hpp | 16 +++++++++++----- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/include/boost/redis/adapter/any_adapter.hpp b/include/boost/redis/adapter/any_adapter.hpp index a32e2545..0311a28d 100644 --- a/include/boost/redis/adapter/any_adapter.hpp +++ b/include/boost/redis/adapter/any_adapter.hpp @@ -53,6 +53,7 @@ public: static auto create_impl(T& resp) -> impl_t { using namespace boost::redis::adapter; + return [adapter2 = boost_redis_adapt(resp)]( any_adapter::parse_event ev, resp3::node_view const& nd, diff --git a/include/boost/redis/adapter/detail/adapters.hpp b/include/boost/redis/adapter/detail/adapters.hpp index 0884632c..fe97b677 100644 --- a/include/boost/redis/adapter/detail/adapters.hpp +++ b/include/boost/redis/adapter/detail/adapters.hpp @@ -139,6 +139,24 @@ void boost_redis_from_bulk(T& t, resp3::basic_node const& node, system:: //================================================ +template +auto prepare_done(T&) noexcept -> std::function +{ + return [] { }; +} + +template +auto prepare_done(generic_flat_response& resp) noexcept -> std::function +{ + return [resp]() mutable { + if (resp.has_value()) { + resp.value().set_view(); + } + }; +} + +//================================================ + template class general_aggregate { private: diff --git a/include/boost/redis/response.hpp b/include/boost/redis/response.hpp index a8a8a414..f236faf3 100644 --- a/include/boost/redis/response.hpp +++ b/include/boost/redis/response.hpp @@ -50,11 +50,7 @@ public: offset_string.offset = data_.size(); offset_string.size = nd.value.size(); - data_.append(nd.value.data()); - - offset_string.data = std::string_view{ - data_.data() + offset_string.offset, - offset_string.size}; + data_.append(nd.value.data(), nd.value.size()); resp3::offset_node new_node; new_node.data_type = nd.data_type; @@ -65,6 +61,16 @@ public: view_.push_back(std::move(new_node)); } + void set_view() + { + for (auto& node : view_) { + auto& offset_string = node.value; + offset_string.data = std::string_view{ + data_.data() + offset_string.offset, + offset_string.size}; + } + } + private: std::string data_; std::vector view_;