← source index

src/TickEntry.h

69 lines  ·  1.8 K  ·  cpp
#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;
};