diff --git a/src/jsonrpc/api.rs b/src/jsonrpc/api.rs index 67e527e8..cfc91838 100644 --- a/src/jsonrpc/api.rs +++ b/src/jsonrpc/api.rs @@ -136,21 +136,28 @@ fn list_coins(control: &DaemonControl, params: Option) -> Result(params: &Option, index: usize, name: &Q) -> Result, Error> +where + String: std::borrow::Borrow, + Q: ?Sized + Ord + Eq + std::hash::Hash + std::fmt::Display, +{ + Ok( + if let Some(i) = params.as_ref().and_then(|p| p.get(index, name)) { + Some(i.as_u64().and_then(|i| i.try_into().ok()).ok_or_else(|| { + Error::invalid_params(format!("Invalid value for '{}': {}", name, i)) + })?) + } else { + None + }, + ) +} + fn list_addresses( control: &DaemonControl, params: Option, ) -> Result { - let start_index: Option = params - .as_ref() - .and_then(|p| p.get(0, "start_index")) - .and_then(|i| i.as_u64()) - .and_then(|i| i.try_into().ok()); - - let count: Option = params - .as_ref() - .and_then(|p| p.get(1, "count")) - .and_then(|c| c.as_u64()) - .and_then(|i| i.try_into().ok()); + let start_index = get_opt_u32(¶ms, 0, "start_index")?; + let count = get_opt_u32(¶ms, 1, "count")?; let res = &control.list_addresses(start_index, count)?; Ok(serde_json::json!(&res)) diff --git a/tests/test_rpc.py b/tests/test_rpc.py index 4c0ff40b..8d2b8247 100644 --- a/tests/test_rpc.py +++ b/tests/test_rpc.py @@ -47,13 +47,29 @@ def test_listaddresses(lianad): assert addr[-1]["index"] == 6 list3 = lianad.rpc.listaddresses() # start_index = 0, receive_index = 0 - _ = lianad.rpc.getnewaddress() # start_index = 0, receive_index = 1 - _ = lianad.rpc.getnewaddress() # start_index = 0, receive_index = 2 + _ = lianad.rpc.getnewaddress() # start_index = 0, receive_index = 1 + _ = lianad.rpc.getnewaddress() # start_index = 0, receive_index = 2 list4 = lianad.rpc.listaddresses() assert len(list4["addresses"]) == len(list3["addresses"]) + 2 == 2 list5 = lianad.rpc.listaddresses(0) assert list4 == list5 + # Will explicitly error on invalid start_index. + with pytest.raises( + RpcError, + match=re.escape( + "Invalid params: Invalid value for \\'start_index\\': \"blabla\"" + ), + ): + lianad.rpc.listaddresses("blabla", None) + + # Will explicitly error on invalid count. + with pytest.raises( + RpcError, + match=re.escape("Invalid params: Invalid value for \\'count\\': \"blb\""), + ): + lianad.rpc.listaddresses(0, "blb") + def test_listcoins(lianad, bitcoind): # Initially empty