#include <ctime>
#include <iostream>
#include <boost/variant2.hpp>
#include <boost/asio/yield.hpp>
const std::string realm = "cppwamp.demo.time";
const std::string address = "localhost";
const short port = 12345u;
{
template <typename TConverter>
void convert(TConverter& conv, std::tm& t)
{
conv ("sec", t.tm_sec)
("min", t.tm_min)
("hour", t.tm_hour)
("mday", t.tm_mday)
("mon", t.tm_mon)
("year", t.tm_year)
("wday", t.tm_wday)
("yday", t.tm_yday)
("isdst", t.tm_isdst);
}
}
void onTimeTick(std::tm time)
{
std::cout << "The current time is: " << std::asctime(&time) << std::endl;
}
using Aftermath = boost::variant2::variant<
boost::variant2::monostate,
struct AftermathChecker
{
void operator()(boost::variant2::monostate) const {}
template <typename T>
{
result.value();
}
};
class TimeClient : boost::asio::coroutine
{
public:
: session_(session)
{}
void operator()(Aftermath aftermath = {})
{
boost::variant2::visit(AftermathChecker{}, aftermath);
std::tm time;
reenter (this)
{
yield session_->connect(*this);
std::cout << "Connected via "
<< boost::variant2::get<1>(aftermath).value() << std::endl;
std::cout << "Joined, SessionId="
<< boost::variant2::get<2>(aftermath).value().id()
<< std::endl;
yield session_->call(
wamp::Rpc(
"get_time"), *
this);
time = boost::variant2::get<3>(aftermath).value()[0].to<std::tm>();
std::cout << "The current time is: " << std::asctime(&time)
<< std::endl;
wamp::simpleEvent<std::tm>(&onTimeTick),
*this);
}
}
private:
};
int main()
{
auto tcp = connector<Json>(ioctx,
TcpHost(address, port));
TimeClient client(session);
client();
ioctx.run();
return 0;
}