serror/
lib.rs

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}