cfx_rpc_utils/error/
jsonrpsee_error_helpers.rs

1use crate::error::error_codes as codes;
2use alloy_rpc_types::error::EthRpcErrorCode;
3use cfx_types::H256;
4use jsonrpsee::types::error::{
5    ErrorObjectOwned, INTERNAL_ERROR_CODE, INTERNAL_ERROR_MSG,
6    INVALID_PARAMS_CODE, INVALID_REQUEST_CODE,
7};
8use serde::Serialize;
9use std::fmt;
10
11pub fn invalid_params_msg(param: &str) -> ErrorObjectOwned {
12    let data: Option<bool> = None;
13    invalid_params_rpc_err(format!("Invalid parameters: {}", param), data)
14}
15
16pub fn invalid_params<S: Serialize>(
17    param: &str, data: Option<S>,
18) -> ErrorObjectOwned {
19    invalid_params_rpc_err(format!("Invalid parameters: {}", param), data)
20}
21
22pub fn invalid_params_detail<T: fmt::Debug>(
23    param: &str, details: T,
24) -> ErrorObjectOwned {
25    ErrorObjectOwned::owned(
26        INVALID_PARAMS_CODE,
27        format!("Invalid parameters: {} {:?}", param, details),
28        Some(format!("{:?}", details)),
29    )
30}
31
32pub fn invalid_params_rpc_err<S: Serialize>(
33    msg: impl Into<String>, data: Option<S>,
34) -> ErrorObjectOwned {
35    ErrorObjectOwned::owned(INVALID_PARAMS_CODE, msg, data)
36}
37
38// code is -32000
39pub fn invalid_input_rpc_err(msg: impl Into<String>) -> ErrorObjectOwned {
40    rpc_err(EthRpcErrorCode::InvalidInput.code(), msg, None::<()>)
41}
42
43pub fn invalid_params_check<T, E: std::fmt::Display>(
44    param: &str, r: std::result::Result<T, E>,
45) -> Result<T, ErrorObjectOwned> {
46    match r {
47        Ok(t) => Ok(t),
48        Err(e) => {
49            Err(invalid_params(param.into(), Some(format!("{}", e))).into())
50        }
51    }
52}
53
54pub fn invalid_request_msg(param: &str) -> ErrorObjectOwned {
55    let data: Option<bool> = None;
56    ErrorObjectOwned::owned(INVALID_REQUEST_CODE, param, data)
57}
58
59pub fn internal_error() -> ErrorObjectOwned {
60    let data: Option<bool> = None;
61    ErrorObjectOwned::owned(INTERNAL_ERROR_CODE, INTERNAL_ERROR_MSG, data)
62}
63
64pub fn internal_error_with_msg(msg: String) -> ErrorObjectOwned {
65    let data: Option<bool> = None;
66    ErrorObjectOwned::owned(INTERNAL_ERROR_CODE, msg, data)
67}
68
69/// Constructs an internal JSON-RPC error.
70pub fn internal_error_with_data<S: Serialize>(data: S) -> ErrorObjectOwned {
71    rpc_err(INTERNAL_ERROR_CODE, INTERNAL_ERROR_MSG, Some(data))
72}
73
74pub fn call_execution_error(message: String, data: String) -> ErrorObjectOwned {
75    ErrorObjectOwned::owned(
76        codes::CALL_EXECUTION_ERROR as i32,
77        message,
78        Some(data),
79    )
80}
81
82pub fn geth_call_execution_error(
83    message: String, data: String,
84) -> ErrorObjectOwned {
85    ErrorObjectOwned::owned(
86        EthRpcErrorCode::ExecutionError.code(),
87        message,
88        Some(data),
89    )
90}
91
92pub fn request_rejected_in_catch_up_mode(
93    details: Option<String>,
94) -> ErrorObjectOwned {
95    ErrorObjectOwned::owned(
96        codes::REQUEST_REJECTED_IN_CATCH_UP as i32,
97        "Request rejected due to still in the catch up mode.",
98        details,
99    )
100}
101
102pub fn request_rejected_too_many_request_error(
103    details: Option<String>,
104) -> ErrorObjectOwned {
105    ErrorObjectOwned::owned(
106        codes::REQUEST_REJECTED_TOO_MANY_REQUESTS as i32,
107        "Request rejected.",
108        details,
109    )
110}
111
112pub fn pivot_assumption_failed(expected: H256, got: H256) -> ErrorObjectOwned {
113    ErrorObjectOwned::owned(
114        codes::CONFLUX_PIVOT_CHAIN_UNSTABLE as i32,
115        "pivot chain assumption failed",
116        Some(format!(
117            "pivot assumption: {:?}, actual pivot hash: {:?}",
118            expected, got
119        )),
120    )
121}
122
123/// Constructs an internal JSON-RPC error with code and message
124pub fn rpc_error_with_code(
125    code: i32, msg: impl Into<String>,
126) -> ErrorObjectOwned {
127    rpc_err(code, msg, None::<()>)
128}
129
130pub fn unimplemented(details: Option<String>) -> ErrorObjectOwned {
131    ErrorObjectOwned::owned(
132        codes::UNSUPPORTED as i32,
133        "This API is not implemented yet",
134        details,
135    )
136}
137
138/// Constructs a JSON-RPC error, consisting of `code`, `message` and optional
139/// `data`.
140pub fn rpc_err<S: Serialize>(
141    code: i32, msg: impl Into<String>, data: Option<S>,
142) -> ErrorObjectOwned {
143    ErrorObjectOwned::owned(code, msg, data)
144}
145
146pub fn unknown_block() -> ErrorObjectOwned {
147    invalid_params_rpc_err("Unknown block number", None::<()>)
148}