switchboard_container_utils/
error.rs

1use std::error::Error;
2use std::fmt;
3use switchboard_common::SbError;
4
5#[derive(Debug)]
6pub enum ContainerError {
7    Message(String),
8    Io(std::io::Error),
9    Bollard(bollard::errors::Error),
10}
11
12impl From<bollard::errors::Error> for ContainerError {
13    fn from(val: bollard::errors::Error) -> Self {
14        ContainerError::Bollard(val)
15    }
16}
17impl From<std::io::Error> for ContainerError {
18    fn from(val: std::io::Error) -> Self {
19        ContainerError::Io(val)
20    }
21}
22
23impl fmt::Display for ContainerError {
24    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
25        match self {
26            ContainerError::Message(message) => write!(f, "Error: {}", message),
27            ContainerError::Io(err) => write!(f, "IO Error: {}", err),
28            ContainerError::Bollard(err) => write!(f, "Bollard Error: {}", err),
29            // Handle other error variants as needed.
30        }
31    }
32}
33
34impl Error for ContainerError {
35    fn source(&self) -> Option<&(dyn Error + 'static)> {
36        match self {
37            ContainerError::Message(_message) => None,
38            ContainerError::Io(err) => Some(err),
39            ContainerError::Bollard(err) => Some(err),
40        }
41    }
42}
43
44impl From<ContainerError> for SbError {
45    fn from(val: ContainerError) -> Self {
46        // SbError::ContainerError(std::sync::Arc::new(self))
47        match val {
48            ContainerError::Message(message) => SbError::CustomMessage(message),
49            ContainerError::Io(err) => SbError::CustomError {
50                message: "IO Error".to_string(),
51                source: std::sync::Arc::new(err),
52            },
53            ContainerError::Bollard(err) => SbError::CustomError {
54                message: "Bollard Error".to_string(),
55                source: std::sync::Arc::new(err),
56            },
57        }
58    }
59}
60
61pub fn handle_bollard_error(err: bollard::errors::Error) -> SbError {
62    SbError::ContainerError(std::sync::Arc::new(ContainerError::Bollard(err)))
63}
64
65pub type ContainerResult<T> = miette::Result<T, SbError>;