#include <chrono>
#include <ctime>
#include <iostream>
#include <future>
#include <boost/asio/steady_timer.hpp>
#include <boost/asio/use_future.hpp>
 
const std::string realm = "cppwamp.demo.time";
const std::string address = "localhost";
const short port = 54321u;
 
{
    
    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);
    }
}
 
std::tm getTime()
{
    auto t = std::time(nullptr);
    return *std::localtime(&t);
}
 
int main()
{
    using boost::asio::use_future;
 
    
    
    boost::asio::io_context ioctx;
    auto work = boost::asio::make_work_guard(ioctx);
    std::thread thread([&ioctx](){ ioctx.run(); });
 
    auto tcp = connector<Json>(ioctx, 
TcpHost(address, port));
 
    boost::asio::steady_timer timer(ioctx);
 
    
    
    auto index = session->connect(use_future).get().value();
    std::cout << "Connected via " << index << std::endl;
 
    auto info = session->join(
Realm(realm), use_future).get().value();
 
    std::cout << "Joined, SessionId=" << info.id() << std::endl;
 
    auto reg = session->enroll(
Procedure(
"get_time"),
 
                               simpleRpc<std::tm>(&getTime),
                               use_future).get().value();
    std::cout << "Registered 'get_time', RegistrationId=" << reg.id()
              << std::endl;
 
    auto deadline = std::chrono::steady_clock::now();
    while (true)
    {
        deadline += std::chrono::seconds(1);
        timer.expires_at(deadline);
        timer.async_wait(use_future).get();
 
        auto t = std::time(nullptr);
        const std::tm* local = std::localtime(&t);
        session->publish(
Pub(
"time_tick").withArgs(*local),
                         use_future).get().value();
        std::cout << "Tick: " << std::asctime(local) << "\n";
    }
 
    return 0;
}