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