cfx_rpc_utils/error/
jsonrpsee_error_helpers.rs1use 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
38pub 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
69pub 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
123pub 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
138pub 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}