/* * PacketStructure.cpp * * Created on: Dec 7, 2022 * Author: valerio */ #include <Packet_Structure_Json.h> using namespace inaf::oasbo::Packets; using Structure = std::vector<std::tuple<uint, std::string, uint>>; Structure PacketStructureJson::readStructureFromSource(std::string source) { Structure s_empty; std::ifstream file; file.open(source, std::ios::in); if (!file.is_open()) { std::cerr << "PacketStructureJson error: Could not open file: " << source << std::endl; std::cerr << "\t Returning empty structure" << std::endl; return s_empty; } uint count = 0; my_json data; try { file >> data; } catch (nlohmann::detail::parse_error &ex) { std::cerr << "PacketStructureJson error: " << ex.what() << std::endl; std::cerr << "\t Returning empty structure" << std::endl; return s_empty; } std::optional<Structure> s_tmp = convertToTupleVector(data, count); file.close(); if (s_tmp.has_value()) return s_tmp.value(); std::cerr << "PacketStructureJson error" << std::endl; std::cerr << "\t Returning empty structure" << std::endl; return s_empty; } std::optional<Structure> PacketStructureJson::convertToTupleVector( const my_json &data, uint &count) { std::optional<Structure> out = Structure(); for (auto it = data.begin(); it != data.end(); ++it) { if (it.value().is_object()) { if (it.value().find("size") == it.value().end() || it.value().find("fields") == it.value().end() || it.value().size() != 2) { std::cerr << "PacketStructureJson error: Error in file: " << it.value().dump() << std::endl; return std::nullopt; } for (uint i = 0; i < it.value()["size"]; i++) { std::optional<Structure> subArray = convertToTupleVector( it.value()["fields"], count).value(); if (!subArray.has_value()) return std::nullopt; std::for_each(subArray.value().begin(), subArray.value().end(), [i](std::tuple<uint, std::string, uint> &line) { std::get<1>(line).append("_#").append( std::to_string(i)); }); out.value().insert(out.value().end(), subArray.value().begin(), subArray.value().end()); } } else { if (!it.value().is_number_integer()) { std::cerr << "PacketStructureJson error: not an int: " << it.value().dump() << std::endl; return std::nullopt; } std::string fieldName(it.key()); std::transform(fieldName.begin(), fieldName.end(), fieldName.begin(), ::tolower); out.value().push_back( std::make_tuple(count, fieldName, it.value())); count += 1; } } return out; }