use crate::generated::shared::ApiError;
#[derive(Debug, derive_more::Display)]
pub enum DockerError {
#[display("docker API error (status {status}): {message}")]
Api {
status: u16,
message: String,
},
#[display("docker transport error: {_0}")]
Transport(String),
#[display("docker JSON parse error: {_0}")]
JsonParse(String),
#[display("docker build failed: {_0}")]
BuildFailed(String),
#[display("docker unavailable: {_0}")]
Unavailable(String),
}
impl std::error::Error for DockerError {}
impl From<ApiError> for DockerError {
fn from(e: ApiError) -> Self {
match e {
ApiError::HttpStatus { code, body, .. } => {
let message = body
.as_deref()
.and_then(|b| {
serde_json::from_str::<serde_json::Value>(b)
.ok()
.and_then(|v| {
v.get("message")
.and_then(|m| m.as_str())
.map(str::to_string)
})
})
.or(body)
.unwrap_or_else(|| "(no body)".to_string());
DockerError::Api { status: code, message }
}
ApiError::RequestBuildFailed(m) | ApiError::RequestSendFailed(m) => {
DockerError::Transport(m)
}
ApiError::ParseFailed(m) => DockerError::JsonParse(m),
}
}
}