dsntk_common/
errors.rs

1//! # Definition of the common error type
2
3use std::{any, fmt};
4
5/// Common result type.
6pub type Result<T, E = DsntkError> = std::result::Result<T, E>;
7
8/// Common trait to be implemented by structs defining a specific error.
9pub trait ToErrorMessage {
10  /// Convert error definition to message string.
11  fn message(self) -> String;
12}
13
14/// Error definition used by all components of this project.
15#[derive(Debug, PartialEq, Eq)]
16pub struct DsntkError(String);
17
18impl fmt::Display for DsntkError {
19  /// Implementation of [Display](fmt::Display) trait for [DsntkError].
20  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21    write!(f, "{}", self.0)
22  }
23}
24
25impl DsntkError {
26  /// Creates a new [DsntkError] with specified source name and error message.
27  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  /// Converts any type that implements [ToErrorMessage] trait to [DsntkError].
37  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}