Skip to main content

pdfkit/
error.rs

1use std::error::Error;
2use std::fmt;
3
4/// Result alias used by the PDFKit wrappers.
5pub type Result<T> = std::result::Result<T, PdfKitError>;
6
7/// Wraps `PDFKitError`.
8#[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    /// Returns the PDFKit framework status code.
23    #[must_use]
24    pub fn code(&self) -> i32 {
25        self.code
26    }
27
28    /// Returns the PDFKit framework error message.
29    #[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}