9 const std::string &file_name,
10 boost::json::value &selected_config) {
12 if (!root_object.if_contains(
"programs")) {
13 selected_config = root_object;
15 for (
const auto &item : root_object) {
16 const auto key = toStdString(item.key());
17 if (
key ==
"$schema" ||
key ==
"version" ||
key ==
"programs")
19 CHKERR failConfig(file_name, makeContext(
"root",
key),
20 "cannot be used together with root.programs; move it "
21 "into a program entry");
24 const auto &programs =
25 requireArray(root_object.at(
"programs"), file_name,
"root.programs");
26 char program_name[PETSC_MAX_PATH_LEN] =
"";
27 CHKERR PetscGetProgramName(program_name,
sizeof(program_name));
29 if (current_executable.empty()) {
30 CHKERR failConfig(file_name,
"root.programs",
31 "unable to determine current executable name");
34 const JsonObject *matching_program =
nullptr;
35 std::string matching_context;
36 for (
size_t program_index = 0; program_index != programs.size();
40 boost::lexical_cast<std::string>(program_index) +
"]";
42 requireObject(programs[program_index], file_name, context);
43 const auto executable_it = program.find(
"executable");
44 if (executable_it == program.end()) {
45 CHKERR failConfig(file_name, makeContext(context,
"executable"),
46 "missing required executable field");
49 const auto executable = requireString(
50 executable_it->value(), file_name, makeContext(context,
"executable"));
51 if (executable != current_executable &&
55 if (matching_program) {
56 CHKERR failConfig(file_name, context,
57 "multiple program entries match executable '" +
58 current_executable +
"'");
60 matching_program = &program;
61 matching_context = context;
64 if (!matching_program) {
65 CHKERR failConfig(file_name,
"root.programs",
66 "no program entry matches executable '" +
67 current_executable +
"'");
70 boost::json::object config_object;
71 if (
const auto version_it = root_object.find(
"version");
72 version_it != root_object.end()) {
73 config_object[
"version"] = version_it->value();
75 for (
const auto &item : *matching_program) {
76 const auto key = toStdString(item.key());
77 if (
key ==
"executable" ||
key ==
"working_directory" ||
78 key ==
"parameters" ||
79 key ==
"$schema" ||
key ==
"version") {
82 config_object[item.key()] = item.value();
84 selected_config = std::move(config_object);
87 << file_name <<
": selected JSON program config " << matching_context
88 <<
" for executable '" << current_executable <<
"'";