1- //
2- // Created by lucio on 4/8/25.
3- //
4-
51#ifndef RPCLITE_CLIENT_H
62#define RPCLITE_CLIENT_H
73#include " error.h"
117
128class RPCClient {
139 RpcDecoder<>* decoder = nullptr ;
10+ int _waiting_msg_id;
1411
1512public:
1613 RpcError lastError;
1714
1815 RPCClient (ITransport& t) : decoder(&RpcDecoderManager<>::getDecoder(t)) {}
1916
20- RPCClient (Stream& stream) {
21- ITransport* transport = (ITransport*) new SerialTransport (stream);
22- decoder = &RpcDecoderManager<>::getDecoder (*transport);
23- }
17+ // This constructor was removed because it leads to decoder duplication
18+ // RPCClient(Stream& stream) {
19+ // ITransport* transport = (ITransport*) new SerialTransport(stream);
20+ // decoder = &RpcDecoderManager<>::getDecoder(*transport);
21+ // }
2422
2523 template <typename ... Args>
2624 void notify (const MsgPack::str_t method, Args&&... args) {
@@ -31,23 +29,44 @@ class RPCClient {
3129 template <typename RType, typename ... Args>
3230 bool call (const MsgPack::str_t method, RType& result, Args&&... args) {
3331
34- int msg_id;
35- if (!decoder->send_call (CALL_MSG, method, msg_id, std::forward<Args>(args)...)){
32+ if (!send_rpc (method, std::forward<Args>(args)...)) {
33+ lastError.code = GENERIC_ERR;
34+ lastError.traceback = " Failed to send RPC call" ;
35+ return false ;
3636 }
3737
38- RpcError error;
3938 // blocking call
40- while (!decoder->get_response (msg_id, result, error)){
41- decoder->decode ();
39+ while (!get_response (result)){
4240 // delay(1);
4341 }
4442
45- lastError.code = error.code ;
46- lastError.traceback = error.traceback ;
43+ return (lastError.code == NO_ERR);
44+
45+ }
46+
47+ template <typename ... Args>
48+ bool send_rpc (const MsgPack::str_t method, Args&&... args) {
49+ int msg_id;
50+ if (decoder->send_call (CALL_MSG, method, msg_id, std::forward<Args>(args)...)) {
51+ _waiting_msg_id = msg_id;
52+ return true ;
53+ }
54+ return false ;
55+ }
4756
48- return (error.code == NO_ERR);
57+ template <typename RType>
58+ bool get_response (RType& result) {
59+ RpcError tmp_error;
60+ decoder->decode ();
4961
62+ if (decoder->get_response (_waiting_msg_id, result, tmp_error)) {
63+ lastError.code = tmp_error.code ;
64+ lastError.traceback = tmp_error.traceback ;
65+ return true ;
66+ }
67+ return false ;
5068 }
69+
5170};
5271
5372#endif // RPCLITE_CLIENT_H
0 commit comments