#pragma once
#include "../Include.h"
#include "Helper.h"
struct TickEntry
{
int64_t mTsNano = 0;
int64_t mPrice = 0;
int64_t mTradeId = 0;
uint8_t mSymIdx = 0;
inline std::string toStr() const
{
return std::to_string(mTsNano) + ',' + std::to_string(mTradeId) + ',' + std::to_string(mPrice);
}
bool operator == (const TickEntry& other) const
{
return (mTsNano == other.mTsNano) && (mPrice == other.mPrice) && (mTradeId == other.mTradeId) && (mSymIdx == other.mSymIdx);
}
};
class TickEntryParser
{
public:
explicit TickEntryParser(const std::vector<std::string>& instrBuffer) : mInstrBuffer(instrBuffer) {};
std::pair<bool, TickEntry> parse(const simdjson::dom::element& json)
{
TickEntry tick;
std::string_view rawTs;
std::string_view rawPx;
std::string_view rawSymIdx;
if(json["price"].get_string().get(rawPx) == simdjson::SUCCESS)
{
tick.mPrice = Helper::parseToPx(rawPx);
} else return {false, tick};
if(json["product_id"].get_string().get(rawSymIdx) == simdjson::SUCCESS)
{
int rez = findInstr(rawSymIdx);
if(rez < 0) return {false, tick};
tick.mSymIdx = rez;
} else return {false, tick};
if(json["time"].get_string().get(rawTs) == simdjson::SUCCESS)
{
tick.mTsNano = Helper::parseTsNs(rawTs, 1000LL);
} else return {false, tick};
tick.mTradeId = json["trade_id"].get_int64();
return {true, tick};
}
private:
int findInstr(std::string_view sv)
{
for(size_t i = 0; i < mInstrBuffer.size(); i++)
if(sv == mInstrBuffer[i]) return static_cast<int>(i);
return -1;
}
private:
std::vector<std::string> mInstrBuffer;
};