fleetflow_container/
error.rs1use thiserror::Error;
2
3#[derive(Error, Debug)]
4pub enum ContainerError {
5 #[error("Dockerに接続できません: {0}\n\nヒント:\n • Dockerが起動しているか確認してください\n • OrbStackまたはDocker Desktopがインストールされているか確認してください")]
6 DockerConnectionFailed(String),
7
8 #[error("コンテナ '{container}' が見つかりません")]
9 ContainerNotFound { container: String },
10
11 #[error("コンテナ '{container}' は既に起動しています")]
12 ContainerAlreadyRunning { container: String },
13
14 #[error("コンテナ '{container}' は既に停止しています")]
15 ContainerAlreadyStopped { container: String },
16
17 #[error("イメージ '{image}' が見つかりません\n\nヒント:\n • イメージ名とタグを確認してください\n • docker pull {image} でイメージをダウンロードしてください")]
18 ImageNotFound { image: String },
19
20 #[error("ポート {port} は既に使用されています\n\nヒント:\n • 別のポート番号を使用してください\n • 既存のコンテナを停止してください: flow down --stage={stage}")]
21 PortAlreadyInUse { port: u16, stage: String },
22
23 #[error("Docker APIエラー: {0}")]
24 DockerApiError(String),
25
26 #[error("設定エラー: {0}")]
27 ConfigError(String),
28}
29
30impl From<bollard::errors::Error> for ContainerError {
31 fn from(err: bollard::errors::Error) -> Self {
32 match &err {
33 bollard::errors::Error::DockerResponseServerError { status_code: 404, .. } => {
34 ContainerError::DockerApiError(err.to_string())
36 }
37 bollard::errors::Error::DockerResponseServerError { status_code: 409, .. } => {
38 ContainerError::DockerApiError(err.to_string())
40 }
41 _ => {
42 let err_str = err.to_string();
44 if err_str.contains("Connection refused") || err_str.contains("No such file or directory") {
45 ContainerError::DockerConnectionFailed(err_str)
46 } else {
47 ContainerError::DockerApiError(err_str)
48 }
49 }
50 }
51 }
52}
53
54pub type Result<T> = std::result::Result<T, ContainerError>;