Initial commit
This commit is contained in:
commit
603d952def
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
/target
|
1161
Cargo.lock
generated
Normal file
1161
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
14
Cargo.toml
Normal file
14
Cargo.toml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
[package]
|
||||||
|
name = "actix-web-addons"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
authors = ["Franklin E. Blanco"]
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
actix-web = "4.1.0"
|
||||||
|
serde_json = { version = "1" }
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
25
src/dtos/message.rs
Normal file
25
src/dtos/message.rs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct MessageResource{
|
||||||
|
pub key: Option<String>,
|
||||||
|
pub message: String
|
||||||
|
}
|
||||||
|
|
||||||
|
impl MessageResource{
|
||||||
|
pub fn new_from_str_with_type(msg: &str) -> MessageResource{
|
||||||
|
MessageResource { key: None, message: String::from(msg) }
|
||||||
|
}
|
||||||
|
pub fn new_empty() -> MessageResource{
|
||||||
|
MessageResource { key: None, message: String::from("") }
|
||||||
|
}
|
||||||
|
pub fn new_from_str(msg: &str) -> MessageResource{
|
||||||
|
MessageResource { key: None, message: String::from(msg) }
|
||||||
|
}
|
||||||
|
pub fn new_from_err(errstr: String) -> MessageResource{
|
||||||
|
MessageResource { key: None, message: errstr }
|
||||||
|
}
|
||||||
|
pub fn new(key: &str, msg: &str) -> MessageResource{
|
||||||
|
MessageResource { key: Some(String::from(key)), message: String::from(msg) }
|
||||||
|
}
|
||||||
|
}
|
1
src/dtos/mod.rs
Normal file
1
src/dtos/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod message;
|
1
src/extensions/mod.rs
Normal file
1
src/extensions/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod typed_response;
|
49
src/extensions/typed_response.rs
Normal file
49
src/extensions/typed_response.rs
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
use actix_web::{HttpResponse, http::StatusCode, web, HttpRequest, HttpResponseBuilder, body::BoxBody, Responder};
|
||||||
|
use serde::Serialize;
|
||||||
|
|
||||||
|
use crate::dtos::message::MessageResource;
|
||||||
|
|
||||||
|
|
||||||
|
pub struct TypedHttpResponse<B: Serialize> {
|
||||||
|
pub response: HttpResponse<Option<web::Json<Result<B, Vec<MessageResource>>>>>,
|
||||||
|
}
|
||||||
|
impl<B: Serialize> TypedHttpResponse<B> {
|
||||||
|
// Returns a response with the json struct inside + Status code
|
||||||
|
pub fn return_standard_response(status_code: StatusCode, body: B) -> TypedHttpResponse<B>{
|
||||||
|
TypedHttpResponse {
|
||||||
|
response: HttpResponse::with_body(StatusCode::from_u16(u16::from(status_code)).unwrap(), Some(web::Json(Ok(body))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Returns a response with the json error list inside + Status code
|
||||||
|
pub fn return_standard_error_list(status_code: StatusCode, body: Vec<MessageResource>) -> TypedHttpResponse<B>{
|
||||||
|
TypedHttpResponse {
|
||||||
|
response: HttpResponse::with_body(StatusCode::from_u16(u16::from(status_code)).unwrap(), Some(web::Json(Err(body))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn return_standard_error(status_code: StatusCode, body: MessageResource) -> TypedHttpResponse<B>{
|
||||||
|
TypedHttpResponse {
|
||||||
|
response: HttpResponse::with_body(StatusCode::from_u16(u16::from(status_code)).unwrap(), Some(web::Json(Err(vec![body]))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Returns an empty response with status code
|
||||||
|
pub fn return_empty_response(status_code: StatusCode) -> TypedHttpResponse<B>{
|
||||||
|
TypedHttpResponse {
|
||||||
|
response: HttpResponse::with_body(StatusCode::from_u16(u16::from(status_code)).unwrap(), None)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T: Serialize> Responder for TypedHttpResponse<T>
|
||||||
|
{
|
||||||
|
type Body = BoxBody;
|
||||||
|
#[inline]
|
||||||
|
fn respond_to(self, _: &HttpRequest) -> HttpResponse<Self::Body> {
|
||||||
|
let mut builder = HttpResponseBuilder::new(self.response.status());
|
||||||
|
match self.response.body() {
|
||||||
|
Some(body) => {match body.0.as_ref() {
|
||||||
|
Ok(value) => builder.json(value),
|
||||||
|
Err(errors) => builder.json(errors),
|
||||||
|
}},
|
||||||
|
None => {builder.finish()}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2
src/lib.rs
Normal file
2
src/lib.rs
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
pub mod extensions;
|
||||||
|
pub mod dtos;
|
Loading…
Reference in New Issue
Block a user