use crate::contracts::ResponseCodeContract;
use crate::enums::ResponseCode;
use crate::http::HttpResult;
use crate::http::responder::Responder;
use crate::http::response::ext::StructResponseExt;
use ntex::web::HttpResponse;
use serde::Serialize;

impl<T: Serialize> StructResponseExt for T {
    fn into_response(self) -> HttpResponse {
        Responder::send(self, ResponseCode::Ok)
    }

    fn respond_code<C: ResponseCodeContract>(self, code: C, msg: &str) -> HttpResult {
        Ok(Responder::send_msg(self, code, msg))
    }

    fn respond_msg(self, msg: &str) -> HttpResult {
        Ok(Responder::send_msg(self, ResponseCode::Ok, msg))
    }

    fn respond(self) -> HttpResult {
        Ok(Responder::send(self, ResponseCode::Ok))
    }

    fn respond_undecorated(self) -> HttpResult {
        self.respond_undecorated_code(ResponseCode::Ok)
    }

    fn respond_undecorated_code(self, code: impl ResponseCodeContract) -> HttpResult {
        Ok(HttpResponse::build(code.status()).json(&self))
    }
}
