dynamic Job::toDynamic()

in bistro/config/Job.cpp [147:224]


dynamic Job::toDynamic(const Config& parent_config) const {
  //
  // First, the fields that are ALWAYS exported. If in doubt, err on the
  // side of always exporting -- see the docblock for the "why?".
  //
  dynamic config = dynamic::object
    (kEnabled, enabled_)
    ("owner", owner_)
    (kLevelForTasks, parent_config.levels.lookup(levelForTasks_))
    ("priority", priority_)
    ("config", config_)
    (kBackoff, backoffSettings_.toDynamic())
    (kKillOrphanTasksAfterSec,
      killOrphanTasksAfterToDynamic(killOrphanTasksAfter_))
    (kTaskSubprocess, taskSubprocessOptionsToDynamic(taskSubprocessOptions_))
    (kKillSubprocess, killRequestToDynamic(killRequest_))
  ;
  {  // As per docblock rule, always export "resources" (inherited from Config)
    dynamic resources_obj = dynamic::object;
    for (const auto& resource_ids : parent_config.levelIDToResourceID) {
      for (auto resource_id : resource_ids) {
        resources_obj[parent_config.resourceNames.lookup(resource_id)] =
          resources_[resource_id];
      }
    }
    if (!resources_obj.empty()) {  // Ok to omit if no resources exist.
      config["resources"] = std::move(resources_obj);
    }
  }
  //
  // The following fields  have trivial, never-changing defaults, so we can
  // safely omit them when empty.
  //
  {  // scope for "filters"
    dynamic filters_obj = dynamic::object;
    for (int i = 0; i < filters_.size(); ++i) {
      if (!filters_[i].isEmpty()) {
        auto d = filters_[i].toDynamic();
        if (!d.empty()) {
          filters_obj[parent_config.levels.lookup(i)] = std::move(d);
        }
      }
    }
    if (!filters_obj.empty()) {
      config["filters"] = std::move(filters_obj);
    }
  }
  if (levelForHostPlacement_ != StringTable::NotFound) {
    config["level_for_host_placement"] =
      parent_config.levels.lookup(levelForHostPlacement_);
  }
  if (!hostPlacement_.empty()) {
    config["host_placement"] = hostPlacement_;
  }
  if (!dependsOn_.empty()) {
    dynamic depends_on = dynamic::array;
    for (auto job_id : dependsOn_) {
      depends_on.push_back(JobNameTable->lookup(job_id));
    }
    config["depends_on"] = depends_on;
  }
  if (createTime_ > 0) {
    config["create_time"] = createTime_;
  }
  if (modifyTime_ > 0) {
    config["modify_time"] = modifyTime_;
  }
  if (!command_.empty()) {
    config[kCommand] = folly::dynamic(command_.begin(), command_.end());
  }
  if (versionID_ >= 0) {
    config["version_id"] = versionID_;
  }
  if (!errors_.empty()) {
    config["errors"] = errors_;
  }
  return config;
}