Uploaded image for project: 'Mesos'
  1. Mesos
  2. MESOS-3580

Refactor 'protobuf' to accept project function

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Won't Fix
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: stout
    • Labels:

      Description

      During the code review of MESOS-3405, Alexander Rukletsov realized that we use the same pattern again and again, for example:

          JSON::Array array;
          array.values.reserve(status.network_infos().size()); // MESOS-2353.
          foreach (const NetworkInfo& info, status.network_infos()) {
            array.values.push_back(model(info));
          }
          object.values["network_infos"] = std::move(array);
      

      We cannot use newly added JSON::protobuf() here, because a different way for rendering JSON from protobuf is used. Without digging deep inside, I know three ways how we create a JSON out of a proto in our codebase:

      • wrap in JSON::Protobuf() for individual messages;
      • wrap in one of the model() family functions;
      • pass as it is for built-in types.

      The proposed conversion function covers one of the possible ways. How about add one more convertion? Something like:

      template <typename T>
      Array protobuf(const google::protobuf::RepeatedPtrField<T>& repeated,
          const lambda::function<JSON::Object>(const T&)>& converter)
      {
        static_assert(std::is_convertible<T*, google::protobuf::Message*>::value,
                      "T must be a google::protobuf::Message");
        JSON::Array array;
        array.values.reserve(repeated.size());
        foreach (const T& elem, repeated) {
          array.values.push_back(converter(elem));
        }
      
        return array;
      }
      

      Then the snippet above could be rewritten as:

      object.values["network_infos"] = std::move(JSON::protobuf(status.network_infos(),
          [](const NetworkInfo& info) { return model(info); });
      

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              klaus1982 Klaus Ma
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: