fleetflow_container/
error.rs

1use 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                // 404エラーは呼び出し側で適切に処理されるべき
35                ContainerError::DockerApiError(err.to_string())
36            }
37            bollard::errors::Error::DockerResponseServerError { status_code: 409, .. } => {
38                // 409エラーも呼び出し側で処理
39                ContainerError::DockerApiError(err.to_string())
40            }
41            _ => {
42                // 接続エラーの可能性をチェック
43                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>;