use serde_repr::{Deserialize_repr, Serialize_repr};
#[repr(i32)]
#[non_exhaustive]
#[derive(Debug, Clone, Copy, Serialize_repr, Deserialize_repr, PartialEq, Eq, Hash)]
pub enum ErrorCode {
ParseError = -32700,
InvalidRequest = -32600,
MethodNotFound = -32601,
InvalidParams = -32602,
InternalError = -32603,
NotSynced = 10001,
PeerUnauthorized = 10002,
PermissionDenied = 10003,
RateLimited = 10004,
ResourceNotFound = 10005,
SlashingGuardBlocked = 10010,
InvalidSignature = 10011,
InvalidProof = 10012,
L1Unavailable = 10020,
WalletLocked = 10030,
ShutdownPending = 10040,
NetworkMismatch = 10050,
VersionMismatch = 10051,
}
impl ErrorCode {
pub fn code(self) -> i32 {
self as i32
}
pub fn is_jsonrpc_reserved(self) -> bool {
let c = self.code();
(-32768..=-32000).contains(&c)
}
pub fn is_dig_specific(self) -> bool {
self.code() >= 10000
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn numeric_values_pinned() {
assert_eq!(ErrorCode::ParseError as i32, -32700);
assert_eq!(ErrorCode::InvalidRequest as i32, -32600);
assert_eq!(ErrorCode::MethodNotFound as i32, -32601);
assert_eq!(ErrorCode::InvalidParams as i32, -32602);
assert_eq!(ErrorCode::InternalError as i32, -32603);
assert_eq!(ErrorCode::NotSynced as i32, 10001);
assert_eq!(ErrorCode::PeerUnauthorized as i32, 10002);
assert_eq!(ErrorCode::PermissionDenied as i32, 10003);
assert_eq!(ErrorCode::RateLimited as i32, 10004);
assert_eq!(ErrorCode::ResourceNotFound as i32, 10005);
assert_eq!(ErrorCode::SlashingGuardBlocked as i32, 10010);
assert_eq!(ErrorCode::InvalidSignature as i32, 10011);
assert_eq!(ErrorCode::InvalidProof as i32, 10012);
assert_eq!(ErrorCode::L1Unavailable as i32, 10020);
assert_eq!(ErrorCode::WalletLocked as i32, 10030);
assert_eq!(ErrorCode::ShutdownPending as i32, 10040);
assert_eq!(ErrorCode::NetworkMismatch as i32, 10050);
assert_eq!(ErrorCode::VersionMismatch as i32, 10051);
}
#[test]
fn serialises_as_integer() {
let s = serde_json::to_string(&ErrorCode::MethodNotFound).unwrap();
assert_eq!(s, "-32601");
let s = serde_json::to_string(&ErrorCode::NotSynced).unwrap();
assert_eq!(s, "10001");
}
#[test]
fn range_classifiers_work() {
assert!(ErrorCode::MethodNotFound.is_jsonrpc_reserved());
assert!(!ErrorCode::MethodNotFound.is_dig_specific());
assert!(ErrorCode::NotSynced.is_dig_specific());
assert!(!ErrorCode::NotSynced.is_jsonrpc_reserved());
}
}