orion_error/core/
reason.rs

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