#pragma once #include #include #include #include // Кодек, который знает, как упаковать/распаковать RPC-запросы/ответы // в/IpcMessage. Живёт в IPC-слое, но опирается на типы RPC-ядра // (RpcValue/RpcArgs). namespace IpcCodec { // Используем ObjectId из специализированного RPC-реестра. using ObjectId = RpcRegistry::ObjectId; // Запрос: ObjectId + имя метода + вектор аргументов. inline IpcMessage encodeRequest(ObjectId objectId, const std::string& method, const RpcArgs& args) { IpcMessage msg; // ObjectId (PoC: приводим к int) msg.add(static_cast(objectId)); // имя метода msg.add(method); // аргументы (PoC: только int) for (const auto& a : args) { msg.add(a.asInt()); } return msg; } inline void decodeRequest(const IpcMessage& msg, ObjectId& objectId, std::string& method, RpcArgs& args) { IpcMessage copy = msg; // ObjectId (PoC: читаем как int и приводим к ObjectId) int rawId = copy.get(); objectId = static_cast(rawId); // имя метода method = copy.get(); // аргументы (PoC: только int, читаем до конца сообщения) args.clear(); while (!copy.empty()) { int v = copy.get(); args.emplace_back(RpcValue::fromInt(v)); } } // Ответ: одно RpcValue (PoC: считаем, что это int). inline IpcMessage encodeResponse(const RpcValue& result) { IpcMessage msg; msg.add(result.asInt()); // PoC: только int return msg; } inline RpcValue decodeResponse(const IpcMessage& msg) { IpcMessage copy = msg; int v = copy.get(); return RpcValue::fromInt(v); } } // namespace IpcCodec