Skip to main content

stout_install/
error.rs

1//! Error types for stout-install
2
3use thiserror::Error;
4
5#[derive(Error, Debug)]
6pub enum Error {
7    #[error("IO error: {0}")]
8    Io(#[from] std::io::Error),
9
10    #[error("JSON error: {0}")]
11    Json(#[from] serde_json::Error),
12
13    #[error("Archive error: {0}")]
14    Archive(String),
15
16    #[error("Package not found: {0}")]
17    PackageNotFound(String),
18
19    #[error("Link failed: {0}")]
20    LinkFailed(String),
21
22    #[error("Invalid bottle format: {0}")]
23    InvalidBottle(String),
24
25    #[error("Build failed: {0}")]
26    Build(#[from] BuildError),
27
28    #[error("Bottle creation failed: {0}")]
29    Bottle(String),
30
31    #[error("Checksum mismatch: expected {expected}, got {actual}")]
32    ChecksumMismatch { expected: String, actual: String },
33
34    #[error("{0}")]
35    Other(String),
36}
37
38/// Specific build errors with context
39#[derive(Error, Debug)]
40pub enum BuildError {
41    #[error("configure script failed for {package}")]
42    ConfigureFailed { package: String },
43
44    #[error("configure script not found for {package}")]
45    ConfigureNotFound { package: String },
46
47    #[error("make failed for {package}")]
48    MakeFailed { package: String },
49
50    #[error("make install failed for {package}")]
51    MakeInstallFailed { package: String },
52
53    #[error("cmake configure failed for {package}")]
54    CmakeConfigureFailed { package: String },
55
56    #[error("cmake build failed for {package}")]
57    CmakeBuildFailed { package: String },
58
59    #[error("cmake install failed for {package}")]
60    CmakeInstallFailed { package: String },
61
62    #[error("meson configure failed for {package}")]
63    MesonConfigureFailed { package: String },
64
65    #[error("meson build failed for {package}")]
66    MesonBuildFailed { package: String },
67
68    #[error("cargo build failed for {package}")]
69    CargoBuildFailed { package: String },
70
71    #[error("meson compile failed for {package}")]
72    MesonCompileFailed { package: String },
73
74    #[error("meson install failed for {package}")]
75    MesonInstallFailed { package: String },
76
77    #[error("unknown build system for {package}")]
78    UnknownBuildSystem { package: String },
79
80    #[error("download failed for {package}: {reason}")]
81    DownloadFailed { package: String, reason: String },
82
83    #[error("extraction failed for {package}: {reason}")]
84    ExtractionFailed { package: String, reason: String },
85
86    #[error("source directory not found for {package}")]
87    SourceDirectoryNotFound { package: String },
88
89    #[error("compiler validation failed: {reason}")]
90    CompilerValidationFailed { reason: String },
91}
92
93impl BuildError {
94    /// Create a ConfigureFailed error
95    pub fn configure_failed(package: &str) -> Self {
96        BuildError::ConfigureFailed {
97            package: package.to_string(),
98        }
99    }
100
101    /// Create a MakeFailed error
102    pub fn make_failed(package: &str) -> Self {
103        BuildError::MakeFailed {
104            package: package.to_string(),
105        }
106    }
107
108    /// Create a MakeInstallFailed error
109    pub fn make_install_failed(package: &str) -> Self {
110        BuildError::MakeInstallFailed {
111            package: package.to_string(),
112        }
113    }
114
115    /// Create a UnknownBuildSystem error
116    pub fn unknown_build_system(package: &str) -> Self {
117        BuildError::UnknownBuildSystem {
118            package: package.to_string(),
119        }
120    }
121}
122
123pub type Result<T> = std::result::Result<T, Error>;