forge/
error.rs

1use std::fmt;
2
3#[derive(Debug)]
4pub enum ConversionError {
5    /// File not found or cannot be read
6    FileNotFound(String),
7    /// Failed to read file contents
8    FileRead(String, std::io::Error),
9    /// Invalid PFX/P12 file format
10    InvalidFormat(String),
11    /// Wrong password or password required
12    Authentication(String),
13    /// Failed to create output directory
14    DirectoryCreation(String, std::io::Error),
15    /// Failed to write output file
16    FileWrite(String, std::io::Error),
17    /// OpenSSL error during conversion
18    Ssl(openssl::error::ErrorStack),
19}
20
21impl fmt::Display for ConversionError {
22    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23        match self {
24            ConversionError::FileNotFound(path) => {
25                write!(f, "PFX file not found: {}", path)
26            }
27            ConversionError::FileRead(path, err) => {
28                write!(f, "Failed to read PFX file '{}': {}", path, err)
29            }
30            ConversionError::InvalidFormat(msg) => {
31                write!(f, "Invalid PFX file format: {}", msg)
32            }
33            ConversionError::Authentication(msg) => {
34                write!(f, "Authentication failed: {}", msg)
35            }
36            ConversionError::DirectoryCreation(path, err) => {
37                write!(f, "Failed to create output directory '{}': {}", path, err)
38            }
39            ConversionError::FileWrite(path, err) => {
40                write!(f, "Failed to write file '{}': {}", path, err)
41            }
42            ConversionError::Ssl(err) => {
43                write!(f, "SSL/TLS error: {}", err)
44            }
45        }
46    }
47}
48
49impl std::error::Error for ConversionError {
50    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
51        match self {
52            ConversionError::FileRead(_, err) => Some(err),
53            ConversionError::DirectoryCreation(_, err) => Some(err),
54            ConversionError::FileWrite(_, err) => Some(err),
55            ConversionError::Ssl(err) => Some(err),
56            _ => None,
57        }
58    }
59}
60
61impl From<openssl::error::ErrorStack> for ConversionError {
62    fn from(err: openssl::error::ErrorStack) -> Self {
63        ConversionError::Ssl(err)
64    }
65}