Accept RPC responses with a `null` `result`
authorMatt Corallo <git@bluematt.me>
Sat, 29 Apr 2023 22:31:24 +0000 (22:31 +0000)
committerMatt Corallo <git@bluematt.me>
Fri, 28 Jul 2023 19:01:34 +0000 (19:01 +0000)
This is actually a valid response in some cases, at least for the
`gettxout` command, where `null` is returned if no corresponding
UTXO was found, but the command otherwise succeeded.

lightning-block-sync/src/rpc.rs

index 4c4706cb1cd584e201fe1464d20abe5015dbe7bc..c778279ae24141f9b4df9e3db48f662e91592cb0 100644 (file)
@@ -105,12 +105,13 @@ impl RpcClient {
                        return Err(std::io::Error::new(std::io::ErrorKind::Other, rpc_error));
                }
 
-               let result = &mut response["result"];
-               if result.is_null() {
-                       return Err(std::io::Error::new(std::io::ErrorKind::InvalidData, "expected JSON result"));
-               }
+               let result = match response.get_mut("result") {
+                       Some(result) => result.take(),
+                       None =>
+                               return Err(std::io::Error::new(std::io::ErrorKind::InvalidData, "expected JSON result")),
+               };
 
-               JsonResponse(result.take()).try_into()
+               JsonResponse(result).try_into()
        }
 }
 
@@ -205,7 +206,7 @@ mod tests {
 
        #[tokio::test]
        async fn call_method_returning_missing_result() {
-               let response = serde_json::json!({ "result": null });
+               let response = serde_json::json!({  });
                let server = HttpServer::responding_with_ok(MessageBody::Content(response));
                let client = RpcClient::new(CREDENTIALS, server.endpoint()).unwrap();