pg-api 0.1.0

A high-performance PostgreSQL REST API driver with rate limiting, connection pooling, and observability
use axum::{
    http::StatusCode,
    response::{IntoResponse, Response},
    Json,
};
use serde_json::json;

#[derive(Debug, thiserror::Error)]
pub enum ApiError {
    #[error("Unauthorized")]
    #[allow(dead_code)]
    Unauthorized,
    
    #[error("Forbidden: {0}")]
    #[allow(dead_code)]
    Forbidden(String),
    
    #[error("Not found: {0}")]
    #[allow(dead_code)]
    NotFound(String),
    
    #[error("Bad request: {0}")]
    #[allow(dead_code)]
    BadRequest(String),
    
    #[error("Internal error: {0}")]
    #[allow(dead_code)]
    InternalError(String),
    
    #[error("Database error: {0}")]
    #[allow(dead_code)]
    DatabaseError(String),
}

impl IntoResponse for ApiError {
    fn into_response(self) -> Response {
        let (status, error_code, message) = match self {
            ApiError::Unauthorized => (StatusCode::UNAUTHORIZED, "UNAUTHORIZED", self.to_string()),
            ApiError::Forbidden(msg) => (StatusCode::FORBIDDEN, "FORBIDDEN", msg),
            ApiError::NotFound(msg) => (StatusCode::NOT_FOUND, "NOT_FOUND", msg),
            ApiError::BadRequest(msg) => (StatusCode::BAD_REQUEST, "BAD_REQUEST", msg),
            ApiError::InternalError(msg) => (StatusCode::INTERNAL_SERVER_ERROR, "INTERNAL_ERROR", msg),
            ApiError::DatabaseError(msg) => (StatusCode::INTERNAL_SERVER_ERROR, "DATABASE_ERROR", msg),
        };
        
        let body = Json(json!({
            "success": false,
            "error": {
                "code": error_code,
                "message": message,
            }
        }));
        
        (status, body).into_response()
    }
}