Newer
Older
/*
* PacketStructure.cpp
*
* Created on: Dec 7, 2022
* Author: valerio
*/
#include <PacketStructureJson.h>
using namespace inaf::oasbo::Packets;
std::vector<std::tuple<uint, std::string, uint>> PacketStructureJson::readStructureFromSource(std::string source) {
std::cerr << "Error: Could not open file: " << source << std::endl;
file >> data;
this->structure = convertToTupleVector(data, count);
file.close();
std::vector<std::tuple<uint, std::string, uint>> PacketStructureJson::convertToTupleVector(
std::vector<std::tuple<uint, std::string, uint>> out;
std::vector<std::string> keys; // Helper vectors to preserve the fields order in the file
std::vector<nlohmann::json> values;
for (auto& element : data.items()) {
keys.push_back(element.key());
values.push_back(element.value());
}
for (size_t i = 0; i < keys.size(); ++i) {
if (values[i].is_object()) {
if (!values[i].count("size") || !values[i].count("fields")
|| values[i].size() != 2) {
std::cerr << "Error in file: " << values[i].dump()
std::vector<std::tuple<uint, std::string, uint>> subArray =
convertToTupleVector(values[i]["fields"], count);
std::get < 1
> (line).append("_#").append(
std::to_string(i));
});
out.insert(out.end(), subArray.begin(), subArray.end());
}
} else {
if (!values[i].is_number_integer()) {
std::cerr << "Error in value, not an int: " << values[i].dump()
std::transform(fieldName.begin(), fieldName.end(),
fieldName.begin(), ::tolower);
out.push_back(std::make_tuple(count, fieldName, values[i]));