chore: add .attach_printable for InternalServerError (#368)

This commit is contained in:
Nishant Joshi
2023-01-17 17:23:57 +05:30
committed by GitHub
parent fb8d67a9f3
commit be9889b47a
14 changed files with 178 additions and 48 deletions

View File

@ -11,10 +11,16 @@ pub(crate) use common_utils::{
fp_utils::when,
validation::validate_email,
};
use error_stack::{IntoReport, ResultExt};
use nanoid::nanoid;
use serde::de::DeserializeOwned;
pub(crate) use self::ext_traits::{OptionExt, ValidateCall};
use crate::consts;
use crate::{
consts,
core::errors::{self, RouterResult},
logger, types,
};
pub mod error_parser {
use std::fmt::Display;
@ -67,3 +73,50 @@ pub mod error_parser {
pub fn generate_id(length: usize, prefix: &str) -> String {
format!("{}_{}", prefix, nanoid!(length, &consts::ALPHABETS))
}
pub trait ConnectorResponseExt: Sized {
fn get_response(self) -> RouterResult<types::Response>;
fn get_error_response(self) -> RouterResult<types::Response>;
fn get_response_inner<T: DeserializeOwned>(self, type_name: &str) -> RouterResult<T> {
self.get_response()?
.response
.parse_struct(type_name)
.change_context(errors::ApiErrorResponse::InternalServerError)
}
}
impl<E> ConnectorResponseExt
for Result<Result<types::Response, types::Response>, error_stack::Report<E>>
{
fn get_error_response(self) -> RouterResult<types::Response> {
self.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Error while receiving response")
.and_then(|inner| match inner {
Ok(res) => {
logger::error!(response=?res);
Err(errors::ApiErrorResponse::InternalServerError)
.into_report()
.attach_printable(format!(
"Expecting error response, received response: {res:?}"
))
}
Err(err_res) => Ok(err_res),
})
}
fn get_response(self) -> RouterResult<types::Response> {
self.change_context(errors::ApiErrorResponse::InternalServerError)
.attach_printable("Error while receiving response")
.and_then(|inner| match inner {
Err(err_res) => {
logger::error!(error_response=?err_res);
Err(errors::ApiErrorResponse::InternalServerError)
.into_report()
.attach_printable(format!(
"Expecting response, received error response: {err_res:?}"
))
}
Ok(res) => Ok(res),
})
}
}