orion_error/core/
reason.rs

1use serde::Serialize;
2use thiserror::Error;
3
4use super::{DomainReason, UvsReason};
5
6/// Represents the root cause of an error, which can be either
7/// a domain-specific reason or a universal system reason.
8#[derive(Error, Debug, Clone, PartialEq, Serialize)]
9pub enum StructReason<T: DomainReason> {
10    #[error("{0}")]
11    Universal(UvsReason),
12    #[error("{0}")]
13    Domain(T),
14}
15impl<T: DomainReason> From<UvsReason> for StructReason<T> {
16    fn from(value: UvsReason) -> Self {
17        Self::Universal(value)
18    }
19}
20
21impl<T: DomainReason> From<T> for StructReason<T> {
22    fn from(value: T) -> Self {
23        Self::Domain(value)
24    }
25}
26
27pub trait ErrorCode {
28    fn error_code(&self) -> i32 {
29        500
30    }
31}
32impl<T: DomainReason + ErrorCode> ErrorCode for StructReason<T> {
33    fn error_code(&self) -> i32 {
34        match self {
35            StructReason::Universal(uvs_reason) => uvs_reason.error_code(),
36            StructReason::Domain(domain) => domain.error_code(),
37        }
38    }
39}
40
41pub fn convert_reason<R1, R2>(other: StructReason<R1>) -> StructReason<R2>
42where
43    R1: DomainReason,
44    R2: DomainReason,
45    StructReason<R2>: From<R1>,
46{
47    match other {
48        StructReason::Universal(uvs_reason) => StructReason::Universal(uvs_reason),
49        StructReason::Domain(domain) => StructReason::from(domain),
50    }
51}