1use crate::{InternalError, InternalErrorClass, InternalErrorOrigin, dto::error::Error};
2
3fn internal_error_to_public(err: &InternalError) -> Error {
4 if let Some(public) = err.public_error() {
5 return public.clone();
6 }
7
8 match err.class() {
9 InternalErrorClass::Access => Error::unauthorized(err.to_string()),
10
11 InternalErrorClass::Domain => match err.origin() {
12 InternalErrorOrigin::Config => Error::invalid(err.to_string()),
13 _ => Error::conflict(err.to_string()),
14 },
15
16 InternalErrorClass::Invariant => Error::invariant(err.to_string()),
17
18 InternalErrorClass::Infra | InternalErrorClass::Ops | InternalErrorClass::Workflow => {
19 Error::internal(err.to_string())
20 }
21 }
22}
23
24impl From<&InternalError> for Error {
25 fn from(err: &InternalError) -> Self {
26 internal_error_to_public(err)
27 }
28}
29
30impl From<InternalError> for Error {
31 fn from(err: InternalError) -> Self {
32 internal_error_to_public(&err)
33 }
34}