1use anyhow::Context;
2
3mod serror;
4
5pub use serror::Serror;
6
7#[cfg(feature = "axum")]
8mod axum;
9#[cfg(feature = "axum")]
10pub use crate::axum::{
11 AddHeaders, AddHeadersError, AddStatusCode, AddStatusCodeError, Error, Json, JsonError, Result,
12};
13
14pub fn serialize_error(e: &anyhow::Error) -> String {
15 try_serialize_error(e).unwrap_or_else(|_| format!("{e:#?}"))
16}
17
18pub fn try_serialize_error(e: &anyhow::Error) -> anyhow::Result<String> {
19 let serror: Serror = e.into();
20 let res = serde_json::to_string(&serror)?;
21 Ok(res)
22}
23
24pub fn serialize_error_pretty(e: &anyhow::Error) -> String {
25 try_serialize_error_pretty(e).unwrap_or_else(|_| format!("{e:#?}"))
26}
27
28pub fn try_serialize_error_pretty(e: &anyhow::Error) -> anyhow::Result<String> {
29 let serror: Serror = e.into();
30 let res = serde_json::to_string_pretty(&serror)?;
31 Ok(res)
32}
33
34pub fn serialize_error_bytes(e: &anyhow::Error) -> Vec<u8> {
35 try_serialize_error_bytes(e).unwrap_or_else(|_| format!("{e:#?}").into_bytes())
36}
37
38pub fn try_serialize_error_bytes(e: &anyhow::Error) -> anyhow::Result<Vec<u8>> {
39 let serror: Serror = e.into();
40 let res = serde_json::to_vec(&serror)?;
41 Ok(res)
42}
43
44pub fn deserialize_error(json: String) -> anyhow::Error {
45 serror_into_anyhow_error(deserialize_serror(json))
46}
47
48pub fn deserialize_serror(json: String) -> Serror {
49 try_deserialize_serror(&json).unwrap_or_else(|_| Serror {
50 error: json.clone(),
51 trace: Default::default(),
52 })
53}
54
55pub fn try_deserialize_serror(json: &str) -> anyhow::Result<Serror> {
56 serde_json::from_str(json).context("failed to deserialize string into Serror")
57}
58
59pub fn deserialize_error_bytes(json: &[u8]) -> anyhow::Error {
60 serror_into_anyhow_error(deserialize_serror_bytes(json))
61}
62
63pub fn deserialize_serror_bytes(json: &[u8]) -> Serror {
64 try_deserialize_serror_bytes(&json).unwrap_or_else(|_| Serror {
65 error: match String::from_utf8(json.to_vec()) {
66 Ok(res) => res,
67 Err(e) => format!("Bytes are not valid utf8 | {e:?}"),
68 },
69 trace: Default::default(),
70 })
71}
72
73pub fn try_deserialize_serror_bytes(json: &[u8]) -> anyhow::Result<Serror> {
74 serde_json::from_slice(json).context("failed to deserialize string into Serror")
75}
76
77pub fn serror_into_anyhow_error(mut serror: Serror) -> anyhow::Error {
78 let mut e = match serror.trace.pop() {
79 None => return anyhow::Error::msg(serror.error),
80 Some(msg) => anyhow::Error::msg(msg),
81 };
82
83 while let Some(msg) = serror.trace.pop() {
84 e = e.context(msg);
85 }
86
87 e = e.context(serror.error);
88
89 e
90}