wb_cache/test/simulation/
types.rs

1use std::env;
2use std::fmt::Debug;
3use std::fmt::Display;
4use std::sync::Arc;
5
6use fieldx::error::FieldXError;
7use parking_lot::RwLock;
8use sea_orm::prelude::*;
9use sea_orm::DbErr;
10use sea_orm::DeriveActiveEnum;
11use sea_orm::EnumIter;
12use serde::Deserialize;
13use serde::Serialize;
14use std::mem;
15
16use super::scriptwriter::steps::Step;
17
18macro_rules! simerr {
19    ($fmt:literal $(, $( $tt:tt )+)?) => {
20        $crate::test::simulation::types::SimErrorAny::with_anyhow(anyhow::anyhow!($fmt $(, $( $tt )+)?))
21    };
22}
23
24pub(crate) use simerr;
25
26pub enum SimError {
27    Any(SimErrorAny),
28    Sim(Arc<SimErrorAny>),
29}
30
31impl SimError {
32    pub fn new<E>(err: E) -> Self
33    where
34        E: std::error::Error + Send + Sync + 'static,
35    {
36        Self::Any(SimErrorAny::new(err))
37    }
38
39    pub fn context<C>(&self, context: C)
40    where
41        C: Display + Send + Sync + 'static,
42    {
43        match self {
44            Self::Any(err) => {
45                err.context(context);
46            }
47            Self::Sim(err) => err.context(context),
48        }
49    }
50
51    pub fn to_string_with_backtrace<S: Display>(&self, msg: S) -> String {
52        match self {
53            Self::Any(err) => err.to_string_with_backtrace(msg),
54            Self::Sim(err) => err.to_string_with_backtrace(msg),
55        }
56    }
57
58    pub fn report_with_backtrace<S: Display>(&self, msg: S) {
59        match self {
60            Self::Any(err) => err.report_with_backtrace(msg),
61            Self::Sim(err) => err.report_with_backtrace(msg),
62        }
63    }
64}
65
66impl Debug for SimError {
67    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
68        match self {
69            Self::Any(err) => Debug::fmt(err, f),
70            Self::Sim(err) => Debug::fmt(err, f),
71        }
72    }
73}
74
75impl Display for SimError {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        match self {
78            Self::Any(err) => Display::fmt(err, f),
79            Self::Sim(err) => Display::fmt(err, f),
80        }
81    }
82}
83
84impl From<anyhow::Error> for SimError {
85    fn from(err: anyhow::Error) -> Self {
86        Self::Any(SimErrorAny(RwLock::new(err)))
87    }
88}
89
90impl From<Arc<SimErrorAny>> for SimError {
91    fn from(err: Arc<SimErrorAny>) -> Self {
92        Self::Sim(err)
93    }
94}
95
96impl From<SimErrorAny> for SimError {
97    fn from(err: SimErrorAny) -> Self {
98        Self::Any(err)
99    }
100}
101
102impl From<DbErr> for SimError {
103    fn from(err: DbErr) -> Self {
104        Self::Any(SimErrorAny(RwLock::new(anyhow::Error::from(err))))
105    }
106}
107
108impl From<FieldXError> for SimError {
109    fn from(err: FieldXError) -> Self {
110        Self::Any(SimErrorAny::from(err))
111    }
112}
113
114impl From<SimError> for SimErrorAny {
115    fn from(err: SimError) -> Self {
116        match err {
117            SimError::Any(e) => e,
118            SimError::Sim(e) => simerr!("{e:?}"),
119        }
120    }
121}
122
123pub type Result<T, ERR = SimErrorAny> = std::result::Result<T, ERR>;
124
125#[derive(Debug)]
126pub struct SimErrorAny(RwLock<anyhow::Error>);
127
128impl<E> From<E> for SimErrorAny
129where
130    E: std::error::Error + Send + Sync + 'static,
131{
132    fn from(err: E) -> Self {
133        Self(RwLock::new(anyhow::Error::new(err)))
134    }
135}
136
137impl SimErrorAny {
138    pub fn new<E>(err: E) -> Self
139    where
140        E: std::error::Error + Send + Sync + 'static,
141    {
142        Self(RwLock::new(anyhow::Error::new(err)))
143    }
144
145    pub fn with_anyhow(err: anyhow::Error) -> Self {
146        Self(RwLock::new(err))
147    }
148
149    pub fn context<C>(&self, context: C)
150    where
151        C: Display + Send + Sync + 'static,
152    {
153        let mut error = self.0.write();
154        let err = mem::replace(&mut *error, anyhow::Error::msg("temp"));
155        let err = err.context(context);
156        *error = err;
157    }
158
159    pub fn with_context<C>(self, context: C) -> Self
160    where
161        C: Display + Send + Sync + 'static,
162    {
163        self.context(context);
164        self
165    }
166
167    pub fn to_string_with_backtrace<S: Display>(&self, msg: S) -> String {
168        let inner = self.0.read();
169        if env::var("RUST_BACKTRACE").is_ok() {
170            format!("{msg}: {inner:?}")
171        }
172        else {
173            format!("{msg}: {inner:#}")
174        }
175    }
176
177    pub fn report_with_backtrace<S: Display>(&self, msg: S) {
178        let inner = self.0.read();
179        if env::var("RUST_BACKTRACE").is_ok() {
180            eprintln!("{msg}: {inner:?}");
181        }
182        else {
183            eprintln!("{msg}: {inner:#}");
184        }
185    }
186}
187
188impl Display for SimErrorAny {
189    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
190        let error = self.0.read();
191        Display::fmt(&*error, f)
192    }
193}
194
195#[derive(Debug, Clone, Copy, PartialEq, Eq, EnumIter, DeriveActiveEnum, Serialize, Deserialize)]
196#[sea_orm(rs_type = "String", db_type = "String(StringLen::N(20))")]
197pub enum OrderStatus {
198    #[sea_orm(string_value = "New")]
199    #[serde(rename = "n")]
200    New,
201    #[sea_orm(string_value = "Backordered")]
202    #[serde(rename = "b")]
203    Backordered,
204    // Re-check if we can proceed with a backordered order.
205    #[sea_orm(string_value = "Recheck")]
206    #[serde(rename = "c")]
207    Recheck,
208    #[sea_orm(string_value = "Pending")]
209    #[serde(rename = "p")]
210    Pending,
211    #[sea_orm(string_value = "Shipped")]
212    #[serde(rename = "s")]
213    Shipped,
214    #[sea_orm(string_value = "Refunded")]
215    #[serde(rename = "r")]
216    Refunded,
217}
218
219#[derive(Serialize, Deserialize)]
220#[serde(deny_unknown_fields)]
221pub struct Script {
222    #[serde(rename = "l")]
223    pub length: usize,
224    #[serde(rename = "s")]
225    pub steps:  Vec<Step>,
226}