Joel Grunbaum
2022-01-12 e8c910e52d1807e2fcca3b43d80a9df6acac5387
json.cpp
@@ -48,7 +48,8 @@
   mapOrder = {{"BUY", book::Buy}, {"SELL", book::Sell}};
   mapTrade = {{"BUY_AGGRESSOR", BUY_AGGRESSOR},
               {"SELL_AGGRESSOR", SELL_AGGRESSOR}};
               {"SELL_AGGRESSOR", SELL_AGGRESSOR},
               {"BROKER_TRADE", BROKER_TRADE}};
   mapOrderSide = {{book::Buy, "BUY"}, {book::Sell, "SELL"}};
}
@@ -58,10 +59,12 @@
SettleMessage* settle(rapidjson::Value& d);
AddedMessage* added(rapidjson::Value& d);
DeletedMessage* deleted(rapidjson::Value& d);
RejectMessage* reject(rapidjson::Value& d);
TradeMessage* trade(rapidjson::Value& d);
BrokerRequest* brokerReq(rapidjson::Value& d);
BrokerAck* brokerAck(rapidjson::Value& d);
BrokerConfirm* brokerCon(rapidjson::Value& d);
ErrorMessage* error(rapidjson::Value& d);
std::queue<Message*> parse(std::string& str)
{
@@ -83,6 +86,7 @@
   if (mapTypes.empty()) {
      initialise();
   }
   if (d.HasMember("error")) return error(d);
   Message* out;
   switch (mapTypes[d["type"].GetString()]) {
   case FUTURE_TYPE:
@@ -99,6 +103,9 @@
      break;
   case DELETED:
      out = deleted(d);
      break;
   case REJECT:
      out = reject(d);
      break;
   case TRADE:
      out = trade(d);
@@ -161,6 +168,12 @@
      d["sequence"].GetInt(), d["timestamp"].GetDouble());
}
RejectMessage* reject(rapidjson::Value& d)
{
   return new RejectMessage(mapTypes[d["type"].GetString()], "",
                            d["error"].GetString(), uint64_t(0), double(0));
}
TradeMessage* trade(rapidjson::Value& d)
{
   return new TradeMessage(
@@ -197,11 +210,25 @@
      d["id"].GetString());
}
ErrorMessage* error(rapidjson::Value& d)
{
   return new ErrorMessage(d["error"].GetString());
}
Message::Message() : type(NONE), product("error") {}
Message::Message(MessageTypes types, std::string product)
   : type(types), product(product)
{
}
ErrorMessage::ErrorMessage(std::string message)
   : Message(ERROR, ""), message(message)
{
}
std::string ErrorMessage::as_string()
{
   return "{\"error\": \"" + this->message + "\"}";
}
FromExchange::FromExchange(MessageTypes type, std::string product,
@@ -252,9 +279,9 @@
{
   if (mapOrderSide.empty()) initialise();
   return "{\"type\": \"ADD\", \"product\": \"" + this->product +
          "\", \"price\": " + std::to_string(this->price) + ", \"side\": \"" +
          mapOrderSide[this->side] +
          "\", \"volume\": " + std::to_string(this->volume) + "}";
         "\", \"price\": " + std::to_string(this->price) + ", \"side\": \"" +
         mapOrderSide[this->side] +
         "\", \"volume\": " + std::to_string(this->volume) + "}";
}
AddedMessage::AddedMessage(MessageTypes type, std::string product,
@@ -264,6 +291,18 @@
   : FromExchange(type, product, sequence, timestamp), id(id), side(side),
     price(price), filled(filled), resting(resting)
{
}
std::string AddedMessage::as_string()
{
   return "{\"type\": \"ADDED\", \"product\": \"" + this->product +
         "\", \"product\": \"" + this->id + "\" \"side\": \"" +
         mapOrderSide[this->side] +
         "\", \"price\": " + std::to_string(this->price) +
         "\"filled\": " + std::to_string(this->filled) +
         ", \"resting\": " + std::to_string(this->resting) +
         ", \"sequence\": " + std::to_string(this->sequence) +
         ", \"timestamp\":" + std::to_string(this->timestamp) + "}";
}
DeleteMessage::DeleteMessage(MessageTypes type, std::string product,
@@ -276,7 +315,7 @@
{
   if (mapOrderSide.empty()) initialise();
   return "{\"type\": \"DELETE\", \"product\": \"" + this->product +
          "\", \"id\": \"" + this->id + "\"}";
         "\", \"id\": \"" + this->id + "\"}";
}
DeletedMessage::DeletedMessage(MessageTypes type, std::string product,
@@ -286,6 +325,15 @@
{
}
std::string DeletedMessage::as_string()
{
   return "{\"type\": \"DELETED\", \"product\": \"" + this->product +
         "\", \"product\": \"" + this->id + "\" \"side\": \"" +
         mapOrderSide[this->side] +
         ", \"sequence\": " + std::to_string(this->sequence) +
         ", \"timestamp\":" + std::to_string(this->timestamp) + "}";
}
RejectMessage::RejectMessage(MessageTypes type, std::string product,
                             std::string error, uint64_t sequence,
                             double timestamp)
@@ -293,6 +341,14 @@
{
}
std::string RejectMessage::as_string()
{
   return "{\"type\": \"REJECT\", \"product\": \"" + this->product =
            "\", \"error\": \"" + this->error +
            "\", \"sequence\": " + std::to_string(this->sequence) +
            ", \"timestamp\": " + std::to_string(this->timestamp) + "}";
}
TradeMessage::TradeMessage(MessageTypes type, std::string product, double price,
                           uint64_t volume, std::string buyer,
                           std::string seller, TradeTypeEnum tradeType,