#pragma once #include #include #include namespace fc { namespace rpc { struct request { optional id; std::string method; variants params; optional jsonrpc; }; struct error_object { int64_t code; std::string message; optional data; }; struct response { response() {} response( const optional& _id, const variant& _result, const optional& version = optional() ) : id(_id), jsonrpc(version), result(_result) {} response( const optional& _id, const error_object& error, const optional& version = optional() ) : id(_id), jsonrpc(version), error(error) {} optional id; optional jsonrpc; optional result; optional error; }; class state { public: typedef std::function method; ~state(); void add_method( const std::string& name, method m ); void remove_method( const std::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( const variant& request_id ); void close(); void on_unhandled( const std::function& unhandled ); private: uint64_t _next_id = 1; std::map::ptr> _awaiting; std::unordered_map _methods; std::function _unhandled; }; } } // namespace fc::rpc FC_REFLECT( fc::rpc::request, (id)(method)(params)(jsonrpc) ); FC_REFLECT( fc::rpc::error_object, (code)(message)(data) ) FC_REFLECT( fc::rpc::response, (id)(jsonrpc)(result)(error) )