7#ifndef BOOST_REDIS_ADAPTER_DETAIL_RESPONSE_TRAITS_HPP
8#define BOOST_REDIS_ADAPTER_DETAIL_RESPONSE_TRAITS_HPP
10#include <boost/redis/adapter/detail/result_traits.hpp>
11#include <boost/redis/resp3/node.hpp>
12#include <boost/redis/response.hpp>
14#include <boost/mp11.hpp>
15#include <boost/system.hpp>
22namespace boost::redis::adapter::detail {
26 template <
class String>
27 void operator()(std::size_t, resp3::basic_node<String>
const& nd, system::error_code& ec)
29 switch (nd.data_type) {
38 auto get_supported_response_size() const noexcept
40 return static_cast<std::size_t
>(-1);
44template <
class Response>
47 static constexpr auto size = std::tuple_size<Response>::value;
48 using adapter_tuple = mp11::mp_transform<adapter_t, Response>;
49 using variant_type = mp11::mp_rename<adapter_tuple, std::variant>;
50 using adapters_array_type = std::array<variant_type, size>;
52 adapters_array_type adapters_;
55 explicit static_adapter(Response& r) { assigner<size - 1>::assign(adapters_, r); }
58 auto get_supported_response_size() const noexcept
63 template <
class String>
64 void operator()(std::size_t i, resp3::basic_node<String>
const& nd, system::error_code& ec)
68 BOOST_ASSERT(i < adapters_.size());
77template <
class Vector>
80 using adapter_type =
typename result_traits<Vector>::adapter_type;
81 adapter_type adapter_;
84 explicit vector_adapter(Vector& v)
85 : adapter_{internal_adapt(v)}
89 auto get_supported_response_size() const noexcept
91 return static_cast<std::size_t
>(-1);
94 template <
class String>
95 void operator()(std::size_t, resp3::basic_node<String>
const& nd, system::error_code& ec)
102struct response_traits;
107 using adapter_type = detail::ignore_adapter;
109 static auto adapt(response_type&)
noexcept {
return detail::ignore_adapter{}; }
115 using adapter_type = detail::ignore_adapter;
117 static auto adapt(response_type&)
noexcept {
return detail::ignore_adapter{}; }
120template <
class String,
class Allocator>
121struct response_traits<
result<std::vector<resp3::basic_node<String>, Allocator>>> {
123 using adapter_type = vector_adapter<response_type>;
125 static auto adapt(response_type& v)
noexcept {
return adapter_type{v}; }
128template <
class... Ts>
129struct response_traits<
response<Ts...>> {
130 using response_type =
response<Ts...>;
131 using adapter_type = static_adapter<response_type>;
133 static auto adapt(response_type& r)
noexcept {
return adapter_type{r}; }
136template <
class Adapter>
139 explicit wrapper(Adapter adapter)
143 template <
class String>
144 void operator()(resp3::basic_node<String>
const& nd, system::error_code& ec)
146 return adapter_(0, nd, ec);
150 auto get_supported_response_size() const noexcept
152 return adapter_.get_supported_response_size();
159template <
class Adapter>
160auto make_adapter_wrapper(Adapter adapter)
162 return wrapper{adapter};
system::result< Value, error > result
Stores response to individual Redis commands.
std::decay_t< decltype(std::ignore)> ignore_t
Type used to ignore responses.
std::tuple< adapter::result< Ts >... > response
Response with compile-time size.
@ resp3_blob_error
Got RESP3 blob_error.
@ resp3_null
Got RESP3 null.
@ resp3_simple_error
Got RESP3 simple error.