use crate::error::APIErrorResponse; use actix_web::body::BoxBody; use actix_web::error::JsonPayloadError; use actix_web::http::StatusCode; use actix_web::{HttpRequest, HttpResponse, Responder}; use serde::Serialize; use std::fmt::{Debug, Display, Formatter}; #[derive(Debug)] pub enum JsonAPIResponse { Error(StatusCode, APIErrorResponse), Success(StatusCode, SuccessResponse), } #[derive(Serialize, Debug)] pub struct SuccessResponse { pub success: bool, pub data: T, } impl Display for JsonAPIResponse { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { write!(f, "{:?}", self) } } // Transparent pass-through to Json() impl Responder for JsonAPIResponse { type Body = BoxBody; fn respond_to(self, _: &HttpRequest) -> HttpResponse { match self { JsonAPIResponse::Error(c, r) => match serde_json::to_string(&r) { Ok(body) => HttpResponse::build(c).body(body), Err(err) => HttpResponse::from_error(JsonPayloadError::Serialize(err)), }, JsonAPIResponse::Success(c, b) => match serde_json::to_string(&b) { Ok(body) => HttpResponse::build(c).body(body), Err(err) => HttpResponse::from_error(JsonPayloadError::Serialize(err)), }, } } }