12 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
14 #include <mrpt/io/CMemoryStream.h>
15 #include <mrpt/serialization/CArchive.h>
19 #include "zmq_fwrds.h"
21 namespace google::protobuf
38 void sendMessage(
const google::protobuf::MessageLite& m, zmq::socket_t& socket);
49 void parseMessage(
const zmq::message_t& msg, google::protobuf::MessageLite& out);
58 std::tuple<std::string, std::string> parseMessageToParts(
const zmq::message_t& msg);
60 template <
typename variant_t,
size_t IDX = 0>
61 variant_t recursiveParse(
const std::string& typeName,
const std::string& serializedData)
63 if constexpr (IDX < std::variant_size_v<variant_t>)
65 using this_t = std::variant_alternative_t<IDX, variant_t>;
67 const std::string expectedName = v.GetTypeName();
68 if (expectedName == typeName)
70 bool ok = v.ParseFromString(serializedData);
74 "Format error: protobuf could not decode binary message of type '%s'",
80 return recursiveParse<variant_t, IDX + 1>(typeName, serializedData);
82 throw UnexpectedMessageException(
83 mrpt::format(
"Type '%s' not found in expected list of variant arguments.", typeName.c_str())
88 std::string get_zmq_endpoint(
const zmq::socket_t& s);
95 template <
typename variant_t>
98 const auto [typeName, serializedData] = internal::parseMessageToParts(msg);
99 return internal::recursiveParse<variant_t>(typeName, serializedData);
103 template <
class... Ts>
106 using Ts::operator()...;
110 template <
class... Ts>
overloaded(Ts...) -> overloaded< Ts... >
zmq::message_t receiveMessage(zmq::socket_t &s)
void parseMessage(const zmq::message_t &msg, google::protobuf::MessageLite &out)
void sendMessage(const google::protobuf::MessageLite &m, zmq::socket_t &socket)
variant_t parseMessageVariant(const zmq::message_t &msg)
Definition: common.h:96