1use crate::{
5 error::{ICustomError, IError, IUnifiedError},
6 identifier::Identifier,
7 serialized::SerializedError,
8};
9use std::fmt::Debug;
10#[derive(Clone, Debug, Eq, PartialEq, serde :: Deserialize, serde :: Serialize)]
11pub struct PackedError<U>
12where
13 U: Clone + Debug,
14{
15 pub identifier: Identifier,
16 pub message: String,
17 pub data: U,
18}
19impl<T> IError<T> for PackedError<T>
20where
21 T: Clone + Debug + serde::Serialize + for<'de> serde::Deserialize<'de>,
22{
23 fn get_identifier(&self) -> Identifier {
24 self.identifier.clone()
25 }
26 fn get_message(&self) -> String {
27 self.message.clone()
28 }
29 fn get_data(&self) -> T {
30 self.data.clone()
31 }
32}
33pub fn pack_unified<T, C>(s: T) -> Result<PackedError<T>, serde_json::Error>
34where
35 T: serde::Serialize + IUnifiedError<C> + Clone + Debug,
36 C: Clone,
37{
38 Ok(PackedError {
39 identifier: s.get_identifier(),
40 message: s.get_message(),
41 data: s,
42 })
43}
44pub fn pack<T, U, C>(s: T) -> PackedError<U>
45where
46 T: serde::Serialize + ICustomError<U, C> + Clone,
47 U: IUnifiedError<C> + Clone + Debug,
48 C: Clone,
49{
50 pack_unified(s.to_unified()).expect("Serialization error")
51}
52pub fn serialized<T, C>(p: PackedError<T>) -> SerializedError
53where
54 T: Clone + Debug + serde::Serialize + IUnifiedError<C>,
55 C: Clone,
56{
57 let data = serde_json::value::to_value(&p.data).expect("Serialization error");
58 SerializedError {
59 code: p.identifier.encode(),
60 message: p.message,
61 data,
62 }
63}
64pub fn serialized_ref<T, C>(p: &PackedError<T>) -> SerializedError
65where
66 T: Clone + Debug + serde::Serialize + IUnifiedError<C>,
67 C: Clone,
68{
69 let data = serde_json::value::to_value(&p.data).expect("Serialization error");
70 SerializedError {
71 code: p.identifier.encode(),
72 message: p.message.clone(),
73 data,
74 }
75}
76impl<T> std::fmt::Display for PackedError<T>
77where
78 T: Clone + Debug + serde::Serialize,
79{
80 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
81 let value = serde_json::value::to_value(&self.data).expect("Serialization error");
82 let value_pretty = serde_json::to_string(&value).expect("Serialization error");
83 let code = self.identifier.encode();
84 let message = &self.message;
85 let data = value_pretty;
86 f.write_fmt(format_args!(
87 r#"{{ code: {code} ; message: "{message}"; data: {data} }}"#,
88 ))
89 }
90}
91impl<T> std::error::Error for PackedError<T> where T: serde::Serialize + Debug + Clone {}