From d2cfd3eeeb8b6af3b7ccda01e6c1ac581a2df398 Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Thu, 13 Jan 2022 06:54:09 +0000
Subject: [PATCH] Added time parsing

---
 test.cpp |    2 +-
 json.cpp |   57 ++++++++++++++++++++++++++++++++++-----------------------
 2 files changed, 35 insertions(+), 24 deletions(-)

diff --git a/json.cpp b/json.cpp
index dfcbbf4..a1b0a7a 100644
--- a/json.cpp
+++ b/json.cpp
@@ -66,6 +66,8 @@
 BrokerConfirm* brokerCon(rapidjson::Value& d);
 ErrorMessage* error(rapidjson::Value& d);
 
+std::chrono::seconds parseTime(std::string& s);
+
 std::queue<Message*> parse(std::string& str)
 {
 	std::queue<Message*> out;
@@ -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(),
@@ -279,9 +290,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,
@@ -296,13 +307,13 @@
 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) + "}";
+	       "\", \"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,
@@ -315,7 +326,7 @@
 {
 	if (mapOrderSide.empty()) initialise();
 	return "{\"type\": \"DELETE\", \"product\": \"" + this->product +
-		   "\", \"id\": \"" + this->id + "\"}";
+	       "\", \"id\": \"" + this->id + "\"}";
 }
 
 DeletedMessage::DeletedMessage(MessageTypes type, std::string product,
@@ -328,10 +339,10 @@
 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) + "}";
+	       "\", \"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,
@@ -344,9 +355,9 @@
 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) + "}";
+	           "\", \"error\": \"" + this->error +
+	           "\", \"sequence\": " + std::to_string(this->sequence) +
+	           ", \"timestamp\": " + std::to_string(this->timestamp) + "}";
 }
 
 TradeMessage::TradeMessage(MessageTypes type, std::string product, double price,
diff --git a/test.cpp b/test.cpp
index b8df66a..1617c70 100644
--- a/test.cpp
+++ b/test.cpp
@@ -23,7 +23,7 @@
 	protocol::catchUp(bs);
 	std::cout << bs.size() << std::endl;
 	for (auto& i : bs) {
-		std::cout << i.first << ", " << i.second.bomPrice << std::endl;
+		std::cout << i.first << ", " << i.second.expiry.count() << ", " << i.second.bomPrice << std::endl;
 		i.second.printBook();
 	}
 }

--
Gitblit v1.9.3