1*693eaed0SAndrew Geissler #include <cassert>
2*693eaed0SAndrew Geissler #include <fstream>
3*693eaed0SAndrew Geissler #include <iostream>
4*693eaed0SAndrew Geissler #include <systemd_target_parser.hpp>
5*693eaed0SAndrew Geissler 
6*693eaed0SAndrew Geissler void validateErrorsToMonitor(std::vector<std::string>& errorsToMonitor)
7*693eaed0SAndrew Geissler {
8*693eaed0SAndrew Geissler     assert(errorsToMonitor.size());
9*693eaed0SAndrew Geissler 
10*693eaed0SAndrew Geissler     const std::vector<std::string> validErrorsToMonitor = {
11*693eaed0SAndrew Geissler         "default", "timeout", "failed", "dependency"};
12*693eaed0SAndrew Geissler     for (const auto& errorToMonitor : errorsToMonitor)
13*693eaed0SAndrew Geissler     {
14*693eaed0SAndrew Geissler         if (std::find(validErrorsToMonitor.begin(), validErrorsToMonitor.end(),
15*693eaed0SAndrew Geissler                       errorToMonitor) == validErrorsToMonitor.end())
16*693eaed0SAndrew Geissler         {
17*693eaed0SAndrew Geissler             throw std::out_of_range("Found invalid error to monitor");
18*693eaed0SAndrew Geissler         }
19*693eaed0SAndrew Geissler     }
20*693eaed0SAndrew Geissler }
21*693eaed0SAndrew Geissler 
22*693eaed0SAndrew Geissler TargetErrorData parseFiles(const std::vector<std::string>& filePaths)
23*693eaed0SAndrew Geissler {
24*693eaed0SAndrew Geissler     TargetErrorData systemdTargetMap;
25*693eaed0SAndrew Geissler     for (const auto& jsonFile : filePaths)
26*693eaed0SAndrew Geissler     {
27*693eaed0SAndrew Geissler         if (gVerbose)
28*693eaed0SAndrew Geissler         {
29*693eaed0SAndrew Geissler             std::cout << "Parsing input file " << jsonFile << std::endl;
30*693eaed0SAndrew Geissler         }
31*693eaed0SAndrew Geissler         std::ifstream fileStream(jsonFile);
32*693eaed0SAndrew Geissler         auto j = json::parse(fileStream);
33*693eaed0SAndrew Geissler 
34*693eaed0SAndrew Geissler         for (auto it = j["targets"].begin(); it != j["targets"].end(); ++it)
35*693eaed0SAndrew Geissler         {
36*693eaed0SAndrew Geissler             targetEntry entry;
37*693eaed0SAndrew Geissler             if (gVerbose)
38*693eaed0SAndrew Geissler             {
39*693eaed0SAndrew Geissler                 std::cout << "target: " << it.key() << " | " << it.value()
40*693eaed0SAndrew Geissler                           << std::endl;
41*693eaed0SAndrew Geissler             }
42*693eaed0SAndrew Geissler 
43*693eaed0SAndrew Geissler             // Be unforgiving on invalid json files. Just throw or allow
44*693eaed0SAndrew Geissler             // nlohmann to throw an exception if something is off
45*693eaed0SAndrew Geissler             auto errorsToMonitor = it.value().find("errorsToMonitor");
46*693eaed0SAndrew Geissler             entry.errorsToMonitor =
47*693eaed0SAndrew Geissler                 errorsToMonitor->get<std::vector<std::string>>();
48*693eaed0SAndrew Geissler 
49*693eaed0SAndrew Geissler             validateErrorsToMonitor(entry.errorsToMonitor);
50*693eaed0SAndrew Geissler 
51*693eaed0SAndrew Geissler             auto errorToLog = it.value().find("errorToLog");
52*693eaed0SAndrew Geissler             entry.errorToLog = errorToLog->get<std::string>();
53*693eaed0SAndrew Geissler 
54*693eaed0SAndrew Geissler             systemdTargetMap[it.key()] = entry;
55*693eaed0SAndrew Geissler         }
56*693eaed0SAndrew Geissler     }
57*693eaed0SAndrew Geissler     return systemdTargetMap;
58*693eaed0SAndrew Geissler }
59