/* Copyright (c) 2018-2022 Marcelo Zimbres Silva (mzimbres@gmail.com) * * Distributed under the Boost Software License, Version 1.0. (See * accompanying file LICENSE.txt) */ #include #if defined(BOOST_ASIO_HAS_CO_AWAIT) #include #include #include "protobuf.hpp" // See the definition in person.proto. This header is automatically // generated by CMakeLists.txt. #include "person.pb.h" namespace net = boost::asio; namespace redis = boost::redis; using boost::redis::request; using boost::redis::response; using boost::redis::operation; using boost::redis::ignore_t; using boost::redis::async_run; using connection = boost::asio::use_awaitable_t<>::as_default_on_t; // The protobuf type described in examples/person.proto using tutorial::person; // Boost.Redis customization points (examples/protobuf.hpp) namespace tutorial { void boost_redis_to_bulk(std::string& to, person const& u) { boost::redis::protobuf::to_bulk(to, u); } void boost_redis_from_bulk(person& u, std::string_view sv, boost::system::error_code& ec) { boost::redis::protobuf::from_bulk(u, sv, ec); } } // tutorial using tutorial::boost_redis_to_bulk; using tutorial::boost_redis_from_bulk; auto run(std::shared_ptr conn, std::string host, std::string port) -> net::awaitable { co_await async_run(*conn, host, port); } net::awaitable co_main(std::string host, std::string port) { auto ex = co_await net::this_coro::executor; auto conn = std::make_shared(ex); net::co_spawn(ex, run(conn, host, port), net::detached); person p; p.set_name("Louis"); p.set_id(3); p.set_email("No email yet."); request req; req.push("HELLO", 3); req.push("SET", "protobuf-key", p); req.push("GET", "protobuf-key"); response resp; // Sends the request and receives the response. co_await conn->async_exec(req, resp); std::cout << "Name: " << std::get<2>(resp).value().name() << "\n" << "Age: " << std::get<2>(resp).value().id() << "\n" << "Email: " << std::get<2>(resp).value().email() << "\n"; conn->cancel(operation::run); } #endif // defined(BOOST_ASIO_HAS_CO_AWAIT)