orion_error/core/
reason.rs1use serde::Serialize;
2use thiserror::Error;
3
4use super::{DomainReason, UvsReason};
5
6#[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}