Handling RPC requests
Let's connect dchatd
up to JSON-RPC
using DarkFi's rpc
module.
We'll need to implement a trait called RequestHandler
for our Dchat
struct. RequestHandler
is an async trait implementing a handler for
incoming JSON-RPC requests. It exposes us to several methods automatically
(including a pong
response) but it also requires that we implement
two methods: handle_request
and connections_mut
.
Let's start with handle_request
. handle_request
is simply a
handle for processing incoming JSON-RPC requests that takes a
JsonRequest
and returns a JsonResult
. JsonRequest
is a
JSON-RPC
request object, and JsonResult
is an enum that wraps
around a given JSON-RPC
object type. These types are defined inside
jsonrpc.rs.
We'll use handle_request
to run a match statement on
JsonRequest.method
.
Running a match on method
will allow us to branch out to functions
that respond to methods received over JSON-RPC
. We haven't implemented
any methods yet, so for now let's just return a JsonError
.
#[async_trait]
impl RequestHandler<()> for Dchat {
async fn handle_request(&self, req: JsonRequest) -> JsonResult {
if req.params.as_array().is_none() {
return JsonError::new(ErrorCode::InvalidRequest, None, req.id).into()
}
debug!(target: "RPC", "--> {}", serde_json::to_string(&req).unwrap());
match req.method.as_str() {
Some(_) | None => JsonError::new(ErrorCode::MethodNotFound, None, req.id).into(),
}
}
}