#include <ctime>
#include <iostream>
#include <boost/asio/awaitable.hpp>
#include <boost/asio/co_spawn.hpp>
#include <boost/asio/detached.hpp>
#include <boost/asio/use_awaitable.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) << "\n";
}
 
{
    using boost::asio::use_awaitable;
 
    (co_await session->connect(use_awaitable)).value();
    (co_await session->join(
Realm(realm), use_awaitable)).value();
 
    auto result = (co_await session->call(
Rpc(
"get_time"),
 
                                          use_awaitable)).value();
    auto time = result[0].to<std::tm>();
    std::cout << "The current time is: " << std::asctime(&time) << "\n";
 
    (co_await session->subscribe(
Topic(
"time_tick"),
                                 wamp::simpleEvent<std::tm>(&onTimeTick),
                                 use_awaitable)).value();
}
 
int main()
{
    auto tcp = connector<Json>(ioctx, 
TcpHost(address, port));
 
    boost::asio::co_spawn(ioctx, client(session), boost::asio::detached);
    ioctx.run();
    return 0;
}