idofront / PacketBuilder

MIT License
1 stars 0 forks source link

メタ情報を扱う Stackable/StackableEntity の抽象型を定義する #38

Open idofront opened 1 month ago

idofront commented 1 month ago

現在 Absolute/AbsoluteEntity のみが提供されているが,今後 Relative/RelativeEntity も提供する予定である.

これらをまとめる抽象型がないため,メタ情報一般を検証したいときに Absolute/AbsoluteEntity しか使えず,残作業となってしまっている.

以下,残作業となってしまっている箇所の一例 (PacketBuilder.hpp より) である.

/// @brief パケットを json ファイルに保存する.
/// @param outputPath 保存先のパス
/// @param packets 保存するパケット
inline void SaveAsJson(std::filesystem::path outputPath, std::vector<Packet::StackablePtr> packets)
{
    auto json = nlohmann::json::array();
    for (auto index = 0; index < packets.size(); index++)
    {
        auto packetToGetJson = std::shared_ptr<Packet::Stackable>(nullptr);
        auto &packet = packets[index];

        // packet が Absolute であることを検証する
        // TODO Absolute 型だけでなく,メタ情報を持つ Stackable であることを検証する.
        auto &stackablePacketRef = *packet;
        if (typeid(stackablePacketRef) == typeid(Packet::Absolute))
        {
            packetToGetJson = packet;
        }
        else
        {
            // メタ情報を持つ Stackable を持たない場合,強制的にメタ情報を付与する.
            SPDLOG_WARN("The stackable does not have the meta information such as timestamp.",
                        "This packet will added a meta information");
            auto pseudoAbsolute = std::make_shared<Packet::Absolute>();
            pseudoAbsolute->TimestampNs.Value(std::chrono::seconds(index));
            packetToGetJson = pseudoAbsolute;
        }

        auto stackableEntityPtr = packetToGetJson->StackableEntity();
        auto stackableEntityJson = stackableEntityPtr->ToJson();
        json.push_back(stackableEntityJson);
    }

    auto ofs = std::ofstream(outputPath);
    ofs << json;
}