folly::dynamic HsJSON::toDynamic()

in common/util/cpp/HsStruct.cpp [60:101]


folly::dynamic HsJSON::toDynamic() && {
  switch (type) {
    case Type::Null:
      return folly::dynamic();
    case Type::Bool:
      return folly::dynamic(static_cast<bool>(integral));
    case Type::Integral:
      return folly::dynamic(integral);
    case Type::Real:
      return folly::dynamic(real);
    case Type::String:
      return folly::dynamic(std::move(string).toStdString());
    case Type::Array: {
      auto res = folly::dynamic::array();
      auto end = std::make_move_iterator(array.end());
      for (auto itr = std::make_move_iterator(array.begin()); itr != end;
           itr++) {
        res.push_back(std::move(*itr).toDynamic());
      }
      return res;
    }
    case Type::Object: {
      folly::dynamic res = folly::dynamic::object;
      auto items = std::move(object).take_items();

      // Manual version of zipping 2 iterators together
      auto key_itr = std::make_move_iterator(items.first.begin());
      auto key_end = std::make_move_iterator(items.first.end());
      auto val_itr = std::make_move_iterator(items.second.begin());
      auto val_end = std::make_move_iterator(items.second.end());

      while (key_itr != key_end && val_itr != val_end) {
        res.insert(
            std::move(*key_itr).toStdString(), std::move(*val_itr).toDynamic());
        key_itr++;
        val_itr++;
      }
      return res;
    }
  }
  folly::assume_unreachable();
}