Joel Grunbaum
2022-01-13 d2cfd3eeeb8b6af3b7ccda01e6c1ac581a2df398
json.cpp
@@ -49,7 +49,7 @@
   mapTrade = {{"BUY_AGGRESSOR", BUY_AGGRESSOR},
               {"SELL_AGGRESSOR", SELL_AGGRESSOR},
                {"BROKER_TRADE", BROKER_TRADE}};
               {"BROKER_TRADE", BROKER_TRADE}};
   mapOrderSide = {{book::Buy, "BUY"}, {book::Sell, "SELL"}};
}
@@ -65,6 +65,8 @@
BrokerAck* brokerAck(rapidjson::Value& d);
BrokerConfirm* brokerCon(rapidjson::Value& d);
ErrorMessage* error(rapidjson::Value& d);
std::chrono::seconds parseTime(std::string& s);
std::queue<Message*> parse(std::string& str)
{
@@ -126,12 +128,21 @@
   return out;
}
std::chrono::seconds parseTime(std::string& s)
{
   return std::chrono::hours{std::stoi(s.substr(0, 4)) * 24 * 30 * 12} +
          std::chrono::hours{std::stoi(s.substr(5, 2)) * 24 * 30} +
          std::chrono::hours{std::stoi(s.substr(8, 2)) * 24} +
          std::chrono::hours{std::stoi(s.substr(11, 2))} +
          std::chrono::minutes{std::stoi(s.substr(14, 2))} +
          std::chrono::hours{std::stoi(s.substr(16, 5))};
}
AnnounceMessage* announce(rapidjson::Value& d)
{
   // std::stringstream expiryStream(d["expiry"].GetString());
   std::string es = d["expiry"].GetString();
   std::chrono::nanoseconds exp_time(0);
   // expiryStream >>
   // date::parse("%Y-%m-%f %H:%M%z", exp_time); // Parsing is broken
   exp_time = parseTime(es);
   return new AnnounceMessage(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["stationId"].GetInt(), d["stationName"].GetString(),
@@ -142,9 +153,9 @@
SettleMessage* settle(rapidjson::Value& d)
{
   // std::stringstream expiryStream(d["expiry"].GetString());
   std::chrono::nanoseconds exp_time(0);
   // expiryStream >> date::parse("%Y-%m-%d %H:%M%z", exp_time);
    std::string es = d["expiry"].GetString();
    exp_time = parseTime(es);
   return new SettleMessage(
      mapTypes[d["type"].GetString()], d["product"].GetString(),
      d["stationName"].GetString(), exp_time, d["price"].GetDouble(),