use std::collections::HashMap;
use http::StatusCode;
#[allow(unused_imports)]
#[macro_use]
extern crate error_info_macros;
#[doc(hidden)]
pub use error_info_macros::*;
pub trait ErrorInfo {
fn status(&self) -> StatusCode;
fn code(&self) -> &'static str;
fn raw_message(&self) -> &'static str;
fn fields(&self) -> HashMap<String, String>;
fn message(&self) -> String {
let mut message = self.raw_message().to_string();
for (k, v) in self.fields() {
message = message.replace(&format!("{{{k}}}"), &v);
}
message
}
}
#[derive(Debug, serde::Serialize)]
pub struct ErrorInfoSummary {
#[serde(serialize_with = "serialize_status")]
pub status: StatusCode,
pub code: &'static str,
pub raw_message: &'static str,
}
#[linkme::distributed_slice]
pub static ERROR_INFO_SUMMARY: [fn() -> Vec<ErrorInfoSummary>] = [..];
pub fn summary() -> Vec<ErrorInfoSummary> {
let mut ret = Vec::with_capacity(ERROR_INFO_SUMMARY.len());
for summaries_fn in ERROR_INFO_SUMMARY {
let mut summaries = summaries_fn();
ret.append(&mut summaries);
}
ret.sort_by_key(|s| (s.status, s.code));
ret
}
fn serialize_status<S>(status: &StatusCode, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_u16(status.as_u16())
}