Skip to content
Snippets Groups Projects
PacketStructureJson.cpp 2.11 KiB
Newer Older
Valerio Pastore's avatar
Valerio Pastore committed
/*
 * PacketStructure.cpp
 *
 *  Created on: Dec 7, 2022
 *      Author: valerio
 */

#include <PacketStructureJson.h>

using namespace inaf::oasbo::Packets;

Valerio Pastore's avatar
Valerio Pastore committed
std::vector<std::tuple<uint, std::string, uint>> PacketStructureJson::readStructureFromSource(std::string source) {
Valerio Pastore's avatar
Valerio Pastore committed
	std::ifstream file;
	file.open(source, std::ios::in);
Valerio Pastore's avatar
Valerio Pastore committed
	if (!file.is_open()) {
		std::cerr << "Error: Could not open file: " << source << std::endl;
Valerio Pastore's avatar
Valerio Pastore committed
		exit (EXIT_FAILURE);
	}
Valerio Pastore's avatar
Valerio Pastore committed
	uint count = 0;
	nlohmann::json data;
Valerio Pastore's avatar
Valerio Pastore committed
	file >> data;
	this->structure = convertToTupleVector(data, count);
	file.close();
	return structure;
Valerio Pastore's avatar
Valerio Pastore committed
std::vector<std::tuple<uint, std::string, uint>> PacketStructureJson::convertToTupleVector(
		const nlohmann::json &data, uint &count) {
Valerio Pastore's avatar
Valerio Pastore committed
	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()
Valerio Pastore's avatar
Valerio Pastore committed
						<< std::endl;
				exit (EXIT_FAILURE);
			}
			for (uint i = 0; i < values[i]["size"]; i++) {
Valerio Pastore's avatar
Valerio Pastore committed
				std::vector<std::tuple<uint, std::string, uint>> subArray =
						convertToTupleVector(values[i]["fields"], count);
Valerio Pastore's avatar
Valerio Pastore committed
				std::for_each(subArray.begin(), subArray.end(),
Valerio Pastore's avatar
Valerio Pastore committed
						[i](std::tuple<uint, std::string, uint> &line) {
Valerio Pastore's avatar
Valerio Pastore committed
							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()
Valerio Pastore's avatar
Valerio Pastore committed
						<< std::endl;
				exit (EXIT_FAILURE);
			}
			std::string fieldName(keys[i]);
Valerio Pastore's avatar
Valerio Pastore committed
			std::transform(fieldName.begin(), fieldName.end(),
					fieldName.begin(), ::tolower);
			out.push_back(std::make_tuple(count, fieldName, values[i]));
Valerio Pastore's avatar
Valerio Pastore committed
			count += 1;
		}
	}
	return out;
}