1use std::{any, fmt};
4
5pub type Result<T, E = DsntkError> = std::result::Result<T, E>;
7
8pub trait ToErrorMessage {
10 fn message(self) -> String;
12}
13
14#[derive(Debug, PartialEq, Eq)]
16pub struct DsntkError(String);
17
18impl fmt::Display for DsntkError {
19 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21 write!(f, "{}", self.0)
22 }
23}
24
25impl DsntkError {
26 pub fn new(source: &str, message: &str) -> Self {
28 Self(format!("<{source}> {message}"))
29 }
30}
31
32impl<T> From<T> for DsntkError
33where
34 T: ToErrorMessage,
35{
36 fn from(value: T) -> Self {
38 let error_type_name = any::type_name::<T>().split("::").last().unwrap_or("UnknownError");
39 DsntkError::new(error_type_name, &value.message())
40 }
41}
42
43#[cfg(test)]
44mod tests {
45 use super::*;
46
47 #[test]
48 fn test_new() {
49 assert_eq!("<TestError> unexpected", format!("{}", DsntkError::new("TestError", "unexpected")));
50 }
51
52 #[test]
53 fn test_debug() {
54 assert_eq!(r#"DsntkError("<TestError> unexpected")"#, format!("{:?}", DsntkError::new("TestError", "unexpected")));
55 }
56
57 #[test]
58 fn test_equal() {
59 let err1 = DsntkError::new("TestError", "unexpected");
60 let err2 = DsntkError::new("TestError", "unexpected");
61 assert!((err1 == err2));
62 }
63
64 #[test]
65 fn test_not_equal() {
66 let err1 = DsntkError::new("TestError", "expected");
67 let err2 = DsntkError::new("TestError", "unexpected");
68 assert!((err1 != err2));
69 }
70
71 #[test]
72 fn test_total_eq() {
73 DsntkError::new("TestError", "unexpected").assert_receiver_is_total_eq();
74 }
75}