wb_cache/test/simulation/
types.rs1use 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 #[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}