use axum::{ Json, http::StatusCode, response::{IntoResponse, Response}, }; use serde_json::json; #[derive(Debug)] pub enum AppError { InvalidPubkey(String), RpcError(String), TransactionBuildError(String), SerializationError(String), InvalidInput(String), TransactionFailed(String), DatabaseError(String), // ADD THIS Custom(String), // ADD THIS } impl std::fmt::Display for AppError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { AppError::InvalidPubkey(msg) => write!(f, "Invalid pubkey: {}", msg), AppError::RpcError(msg) => write!(f, "RPC error: {}", msg), AppError::TransactionBuildError(msg) => write!(f, "Transaction build error: {}", msg), AppError::SerializationError(msg) => write!(f, "Serialization error: {}", msg), AppError::InvalidInput(msg) => write!(f, "Invalid input: {}", msg), AppError::TransactionFailed(msg) => write!(f, "Transaction failed: {}", msg), AppError::DatabaseError(msg) => write!(f, "Database error: {}", msg), // ADD THIS AppError::Custom(msg) => write!(f, "Error: {}", msg), // ADD THIS } } } impl std::error::Error for AppError {} impl IntoResponse for AppError { fn into_response(self) -> Response { let (status, error_message) = match self { AppError::InvalidPubkey(msg) => (StatusCode::BAD_REQUEST, msg), AppError::RpcError(msg) => (StatusCode::SERVICE_UNAVAILABLE, msg), AppError::TransactionBuildError(msg) => (StatusCode::INTERNAL_SERVER_ERROR, msg), AppError::SerializationError(msg) => (StatusCode::INTERNAL_SERVER_ERROR, msg), AppError::InvalidInput(msg) => (StatusCode::BAD_REQUEST, msg), AppError::TransactionFailed(msg) => (StatusCode::BAD_REQUEST, msg), AppError::DatabaseError(msg) => (StatusCode::INTERNAL_SERVER_ERROR, msg), // ADD THIS AppError::Custom(msg) => (StatusCode::INTERNAL_SERVER_ERROR, msg), // ADD THIS }; let body = Json(json!({ "error": error_message, })); (status, body).into_response() } }