393 {
395
396 std::ifstream input(file_name.c_str(), std::ifstream::in);
397 if (!input.good()) {
398 CHKERR failConfig(file_name,
"",
"unable to open JSON config file");
399 }
400
401 std::ostringstream buffer;
402 buffer << input.rdbuf();
403
404 boost::system::error_code ec;
405 auto root = boost::json::parse(buffer.str(), ec);
406 if (ec) {
407 CHKERR failConfig(file_name,
"",
"invalid JSON: " + ec.message());
408 }
409
410 const auto &root_object = requireObject(root, file_name, "root");
411 boost::json::value selected_config;
413 const auto &config_object = requireObject(selected_config, file_name, "root");
414
415 bool has_version = false;
416 for (const auto &item : config_object) {
417 const auto key = toStdString(item.key());
418 if (
key ==
"$schema")
419 continue;
420 if (
key ==
"version") {
421 has_version = true;
422 const auto version =
423 requireString(item.value(), file_name, makeContext(
"root",
key));
425 CHKERR failConfig(file_name, makeContext(
"root",
key),
426 "unsupported config version '" + version +
428 "'");
429 }
430 continue;
431 }
432 if (
key ==
"petsc") {
433 requireObject(item.value(), file_name, makeContext(
"root",
key));
434 continue;
435 }
436 if (
key ==
"mofem") {
437 requireObject(item.value(), file_name, makeContext(
"root",
key));
438 continue;
439 }
440 if (
key ==
"meshes" ||
key ==
"input_files") {
441 requireArray(item.value(), file_name, makeContext(
"root",
key));
442 continue;
443 }
444 if (
key ==
"file_name") {
446 file_name, makeContext(
"root",
key),
447 "legacy root-level file_name is not supported; use "
448 "root.input_files[0].file_name or root.meshes[0].file_name");
449 }
450 if (
key ==
"meshsets") {
452 file_name, makeContext(
"root",
key),
453 "legacy root-level meshsets is not supported; use "
454 "root.input_files[i].meshsets or root.meshes[i].meshsets");
455 }
456 CHKERR failConfig(file_name, makeContext(
"root",
key),
457 "unknown top-level key");
458 }
459 if (!has_version) {
460 CHKERR failConfig(file_name,
"root.version",
461 "missing required version field");
462 }
464
465 std::vector<ParsedMeshEntry> new_meshes;
466 bool config_has_meshsets = false;
468 &config_has_meshsets);
469
475 for (const auto &entry : new_meshes) {
478 }
481 }
482 }
486
488}
MoFEMErrorCode collectMeshes(const JsonObject &root_object, const std::string &file_name, std::vector< ParsedMeshEntry > &meshes, bool *has_meshsets)
bool isPythonScriptMeshType(const std::string &type)
constexpr auto MOAB_MESH_TYPE
MoFEMErrorCode selectProgramConfig(const JsonObject &root_object, const std::string &file_name, boost::json::value &selected_config)
static const std::string & supportedVersion()