1use std::error::Error;
2use std::fmt;
3
4pub type Result<T> = std::result::Result<T, PdfKitError>;
6
7#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct PdfKitError {
10 code: i32,
11 message: String,
12}
13
14impl PdfKitError {
15 pub(crate) fn new(code: i32, message: impl Into<String>) -> Self {
16 Self {
17 code,
18 message: message.into(),
19 }
20 }
21
22 #[must_use]
24 pub fn code(&self) -> i32 {
25 self.code
26 }
27
28 #[must_use]
30 pub fn message(&self) -> &str {
31 &self.message
32 }
33}
34
35impl fmt::Display for PdfKitError {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 write!(f, "{} (status {})", self.message, self.code)
38 }
39}
40
41impl Error for PdfKitError {}
42
43#[cfg(test)]
44mod tests {
45 use super::PdfKitError;
46
47 #[test]
48 fn constructor_accessors_and_display_match() {
49 let error = PdfKitError::new(-3, "failed to parse action");
50
51 assert_eq!(error.code(), -3);
52 assert_eq!(error.message(), "failed to parse action");
53 assert_eq!(error.to_string(), "failed to parse action (status -3)");
54 }
55
56 #[test]
57 fn cloned_errors_preserve_payloads_and_have_no_source() {
58 let error = PdfKitError::new(-5, "bad annotation");
59 let cloned = error.clone();
60 let as_std_error: &dyn std::error::Error = &cloned;
61
62 assert_eq!(cloned, error);
63 assert!(as_std_error.source().is_none());
64 }
65}