You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
2.1 KiB
C++

#pragma once
#include <ipc/IpcConfig.h>
#include <rpc/RpcRegistry.h>
#include <rpc/RpcValue.h>
#include <string>
// Кодек, который знает, как упаковать/распаковать 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<int>(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<int>();
objectId = static_cast<ObjectId>(rawId);
// имя метода
method = copy.get<std::string>();
// аргументы (PoC: только int, читаем до конца сообщения)
args.clear();
while (!copy.empty()) {
int v = copy.get<int>();
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<int>();
return RpcValue::fromInt(v);
}
} // namespace IpcCodec