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 Wu void 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 Wu json 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