Newer
Older
/*
* PacketStructure.cpp
*
* Created on: Dec 7, 2022
* Author: valerio
*/
using Structure = std::vector<std::tuple<uint, std::string, uint>>;
Structure PacketStructureJson::readStructureFromSource(std::string source) {
Structure s_empty;
std::cerr << "PacketStructureJson error: Could not open file: "
<< source << std::endl;
std::cerr << "\t Returning empty structure" << std::endl;
return s_empty;
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);
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(
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()
std::cerr << "PacketStructureJson error: Error in file: "
<< it.value().dump() << std::endl;
return std::nullopt;
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(),
std::get<1>(line).append("_#").append(
std::to_string(i));
out.value().insert(out.value().end(), subArray.value().begin(),
subArray.value().end());
std::cerr << "PacketStructureJson error: not an int: "
<< it.value().dump() << std::endl;
return std::nullopt;
std::transform(fieldName.begin(), fieldName.end(),
fieldName.begin(), ::tolower);
out.value().push_back(
std::make_tuple(count, fieldName, it.value()));