/
count_rochester
/
rust_microservices
Обзор
Документация
Войти
/
count_rochester
/
rust_microservices
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
services/api_gateway/src/api/error.rs
66 строк
2 KB
Гусев Андрей
Added internal api
03 авг 2024, 19:05
03 авг 2024, 19:05
e1517ee
Код
Авторство
О чём код?
use std::sync::Arc; use axum::{ http::StatusCode, response::{IntoResponse, Response}, }; use derive_more::From; use serde::Serialize; use serde_with::{serde_as, DisplayFromStr}; use tracing::debug; pub type Result<T> = core::result::Result<T, Error>; use super::internal; #[serde_as] #[derive(Debug, Serialize, From, strum_macros::AsRefStr)] pub enum Error { #[from] UsersClientError(#[serde_as(as = "DisplayFromStr")] internal::Error), #[from] GrpcError(#[serde_as(as = "DisplayFromStr")] tonic::Status), } impl core::fmt::Display for Error { fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::result::Result<(), core::fmt::Error> { write!(fmt, "{self:?}") } } impl Error { pub fn client_status_and_err(&self) -> (StatusCode, ClientError) { #[allow(unreachable_patterns)] match self { _ => ( StatusCode::INTERNAL_SERVER_ERROR, ClientError::SERVICE_ERROR, ), } } } impl std::error::Error for Error {} impl IntoResponse for Error { fn into_response(self) -> Response { debug!(" {:<12} - {self:?}", "INTO_RES"); let mut response = StatusCode::INTERNAL_SERVER_ERROR.into_response(); response.extensions_mut().insert(Arc::new(self)); response } } #[derive(Debug, Serialize, strum_macros::AsRefStr)] #[serde(tag = "message", content = "detail")] #[allow(non_camel_case_types)] pub enum ClientError { LOGIN_FAIL, NO_AUTH, INVALID_REQUEST, ENTITY_NOT_FOUND { entity: &'static str, id: i64 }, SERVICE_ERROR, }