7#include <boost/asio.hpp>
8#if defined(BOOST_ASIO_HAS_CO_AWAIT)
9#include <boost/asio/experimental/awaitable_operators.hpp>
14#include "common/common.hpp"
16namespace net = boost::asio;
17namespace resp3 = aedis::resp3;
18using namespace net::experimental::awaitable_operators;
21void print(std::map<std::string, std::string>
const& cont)
23 for (
auto const& e: cont)
24 std::cout << e.first <<
": " << e.second <<
"\n";
27void print(std::vector<int>
const& cont)
29 for (
auto const& e: cont) std::cout << e <<
" ";
33auto run(std::shared_ptr<connection> conn, std::string host, std::string port) -> net::awaitable<void>
35 co_await connect(conn, host, port);
36 co_await conn->async_run();
40auto store(std::shared_ptr<connection> conn) -> net::awaitable<void>
45 std::map<std::string, std::string>
map
46 {{
"key1",
"value1"}, {
"key2",
"value2"}, {
"key3",
"value3"}};
53 co_await conn->async_exec(req);
56auto hgetall(std::shared_ptr<connection> conn) -> net::awaitable<void>
61 req.
push(
"HGETALL",
"hset-key");
64 std::tuple<aedis::ignore, std::map<std::string, std::string>> resp;
67 co_await conn->async_exec(req,
adapt(resp));
69 print(std::get<1>(resp));
73auto transaction(std::shared_ptr<connection> conn) -> net::awaitable<void>
78 req.
push(
"LRANGE",
"rpush-key", 0, -1);
79 req.
push(
"HGETALL",
"hset-key");
87 std::tuple<std::optional<std::vector<int>>, std::optional<std::map<std::string, std::string>>>
90 co_await conn->async_exec(req,
adapt(resp));
92 print(std::get<0>(std::get<4>(resp)).value());
93 print(std::get<1>(std::get<4>(resp)).value());
96auto quit(std::shared_ptr<connection> conn) -> net::awaitable<void>
101 co_await conn->async_exec(req);
105net::awaitable<void> co_main(std::string host, std::string port)
107 auto ex =
co_await net::this_coro::executor;
108 auto conn = std::make_shared<connection>(ex);
109 net::co_spawn(ex,
run(conn, host, port), net::detached);
110 co_await store(conn);
111 co_await transaction(conn);
112 co_await hgetall(conn);
void push(std::string_view cmd, Ts const &... args)
Appends a new command to the end of the request.
void push_range(std::string_view cmd, Key const &key, ForwardIterator begin, ForwardIterator end, typename std::iterator_traits< ForwardIterator >::value_type *=nullptr)
Appends a new command to the end of the request.
adapter::detail::ignore ignore
Tag used to ignore responses.
auto adapt(std::size_t max_read_size=(std::numeric_limits< std::size_t >::max)()) noexcept
Creates an adapter that ignores responses.
@ run
Refers to connection::async_run operations.