Skip to main content

solana_keychain/
error.rs

1//! Error types for signer operations
2
3use std::fmt;
4use thiserror::Error;
5
6/// Errors that can occur during signing operations
7#[derive(Error)]
8pub enum SignerError {
9    /// Invalid private key format
10    #[error("Invalid private key format: {0}")]
11    InvalidPrivateKey(String),
12
13    /// Invalid public key format
14    #[error("Invalid public key: {0}")]
15    InvalidPublicKey(String),
16
17    /// Signing operation failed
18    #[error("Signing failed: {0}")]
19    SigningFailed(String),
20
21    /// Remote API error (Vault, Privy, Turnkey)
22    #[error("Remote API error: {0}")]
23    RemoteApiError(String),
24
25    /// HTTP request error
26    #[error("HTTP request failed: {0}")]
27    HttpError(String),
28
29    /// Serialization/deserialization error
30    #[error("Serialization error: {0}")]
31    SerializationError(String),
32
33    /// Configuration error
34    #[error("Configuration error: {0}")]
35    ConfigError(String),
36
37    /// Signer not available
38    #[error("Signer not available: {0}")]
39    NotAvailable(String),
40
41    /// IO error (file operations)
42    #[error("IO error: {0}")]
43    IoError(String),
44
45    /// Generic error
46    #[error("{0}")]
47    Other(String),
48}
49
50impl From<std::io::Error> for SignerError {
51    fn from(err: std::io::Error) -> Self {
52        SignerError::IoError(err.to_string())
53    }
54}
55
56impl From<serde_json::Error> for SignerError {
57    fn from(err: serde_json::Error) -> Self {
58        SignerError::SerializationError(err.to_string())
59    }
60}
61
62#[cfg(any(
63    feature = "vault",
64    feature = "privy",
65    feature = "turnkey",
66    feature = "fireblocks",
67    feature = "cdp",
68    feature = "dfns",
69    feature = "para"
70))]
71impl From<reqwest::Error> for SignerError {
72    fn from(err: reqwest::Error) -> Self {
73        SignerError::HttpError(err.to_string())
74    }
75}
76
77// Custom Debug implementation to prevent leaking sensitive information
78impl fmt::Debug for SignerError {
79    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
80        match self {
81            SignerError::InvalidPrivateKey(_) => {
82                write!(f, "SignerError::InvalidPrivateKey([REDACTED])")
83            }
84            SignerError::InvalidPublicKey(_) => {
85                write!(f, "SignerError::InvalidPublicKey([REDACTED])")
86            }
87            SignerError::SigningFailed(_) => write!(f, "SignerError::SigningFailed([REDACTED])"),
88            SignerError::RemoteApiError(_) => {
89                write!(f, "SignerError::RemoteApiError([REDACTED])")
90            }
91            SignerError::HttpError(_) => write!(f, "SignerError::HttpError([REDACTED])"),
92            SignerError::SerializationError(_) => {
93                write!(f, "SignerError::SerializationError([REDACTED])")
94            }
95            SignerError::ConfigError(_) => write!(f, "SignerError::ConfigError([REDACTED])"),
96            SignerError::NotAvailable(_) => write!(f, "SignerError::NotAvailable([REDACTED])"),
97            SignerError::IoError(_) => write!(f, "SignerError::IoError([REDACTED])"),
98            SignerError::Other(_) => write!(f, "SignerError::Other([REDACTED])"),
99        }
100    }
101}