#pragma once #include #include #include namespace fc { namespace rpc { struct request { optional id; std::string method; variants params; }; struct error_object { int64_t code = 0; std::string message; optional data; }; struct response { int64_t id = 0; optional result; optional error; }; class state { public: typedef std::function method; ~state(); void add_method( const fc::string& name, method m ); void remove_method( const fc::string& name ); variant local_call( const string& method_name, const variants& args ); void handle_reply( const response& response ); request start_remote_call( const string& method_name, variants args ); variant wait_for_response( uint64_t request_id ); void close(); private: uint64_t _next_id = 1; std::unordered_map::ptr> _awaiting; std::unordered_map _methods; }; } } // namespace fc::rpc FC_REFLECT( fc::rpc::request, (id)(method)(params) ); FC_REFLECT( fc::rpc::error_object, (code)(message)(data) ) FC_REFLECT( fc::rpc::response, (id)(result)(error) )