1*3dcfd546SHarvey Wu #include "buildjson/buildjson.hpp" 2*3dcfd546SHarvey Wu 3*3dcfd546SHarvey Wu #include "errors/exception.hpp" 4*3dcfd546SHarvey Wu 5*3dcfd546SHarvey Wu #include <nlohmann/json.hpp> 6*3dcfd546SHarvey Wu 7*3dcfd546SHarvey Wu #include <fstream> 8*3dcfd546SHarvey Wu 9*3dcfd546SHarvey Wu using json = nlohmann::json; 10*3dcfd546SHarvey Wu validateJson(const json & data)11*3dcfd546SHarvey Wuvoid validateJson(const json& data) 12*3dcfd546SHarvey Wu { 13*3dcfd546SHarvey Wu if (data.count("sensors") != 1) 14*3dcfd546SHarvey Wu { 15*3dcfd546SHarvey Wu throw ConfigurationException( 16*3dcfd546SHarvey Wu "KeyError: 'sensors' not found (or found repeatedly)"); 17*3dcfd546SHarvey Wu } 18*3dcfd546SHarvey Wu 19*3dcfd546SHarvey Wu if (data["sensors"].size() == 0) 20*3dcfd546SHarvey Wu { 21*3dcfd546SHarvey Wu throw ConfigurationException( 22*3dcfd546SHarvey Wu "Invalid Configuration: At least one sensor required"); 23*3dcfd546SHarvey Wu } 24*3dcfd546SHarvey Wu 25*3dcfd546SHarvey Wu if (data.count("zones") != 1) 26*3dcfd546SHarvey Wu { 27*3dcfd546SHarvey Wu throw ConfigurationException( 28*3dcfd546SHarvey Wu "KeyError: 'zones' not found (or found repeatedly)"); 29*3dcfd546SHarvey Wu } 30*3dcfd546SHarvey Wu 31*3dcfd546SHarvey Wu for (const auto& zone : data["zones"]) 32*3dcfd546SHarvey Wu { 33*3dcfd546SHarvey Wu if (zone.count("pids") != 1) 34*3dcfd546SHarvey Wu { 35*3dcfd546SHarvey Wu throw ConfigurationException( 36*3dcfd546SHarvey Wu "KeyError: should only have one 'pids' key per zone."); 37*3dcfd546SHarvey Wu } 38*3dcfd546SHarvey Wu 39*3dcfd546SHarvey Wu if (zone["pids"].size() == 0) 40*3dcfd546SHarvey Wu { 41*3dcfd546SHarvey Wu throw ConfigurationException( 42*3dcfd546SHarvey Wu "Invalid Configuration: must be at least one pid per zone."); 43*3dcfd546SHarvey Wu } 44*3dcfd546SHarvey Wu } 45*3dcfd546SHarvey Wu } 46*3dcfd546SHarvey Wu parseValidateJson(const std::string & path)47*3dcfd546SHarvey Wujson parseValidateJson(const std::string& path) 48*3dcfd546SHarvey Wu { 49*3dcfd546SHarvey Wu std::ifstream jsonFile(path); 50*3dcfd546SHarvey Wu if (!jsonFile.is_open()) 51*3dcfd546SHarvey Wu { 52*3dcfd546SHarvey Wu throw ConfigurationException("Unable to open json file"); 53*3dcfd546SHarvey Wu } 54*3dcfd546SHarvey Wu 55*3dcfd546SHarvey Wu auto data = json::parse(jsonFile, nullptr, false); 56*3dcfd546SHarvey Wu if (data.is_discarded()) 57*3dcfd546SHarvey Wu { 58*3dcfd546SHarvey Wu throw ConfigurationException("Invalid json - parse failed"); 59*3dcfd546SHarvey Wu } 60*3dcfd546SHarvey Wu 61*3dcfd546SHarvey Wu /* Check the data. */ 62*3dcfd546SHarvey Wu validateJson(data); 63*3dcfd546SHarvey Wu 64*3dcfd546SHarvey Wu return data; 65*3dcfd546SHarvey Wu } 66