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    #[error("git clone failed for {package}: {reason}")]
93    GitCloneFailed { package: String, reason: String },
94
95    #[error("git operation failed for {package}: {reason}")]
96    GitFailed { package: String, reason: String },
97
98    #[error("no HEAD URL available for {package}")]
99    HeadUrlMissing { package: String },
100}
101
102impl BuildError {
103    /// Create a ConfigureFailed error
104    pub fn configure_failed(package: &str) -> Self {
105        BuildError::ConfigureFailed {
106            package: package.to_string(),
107        }
108    }
109
110    /// Create a MakeFailed error
111    pub fn make_failed(package: &str) -> Self {
112        BuildError::MakeFailed {
113            package: package.to_string(),
114        }
115    }
116
117    /// Create a MakeInstallFailed error
118    pub fn make_install_failed(package: &str) -> Self {
119        BuildError::MakeInstallFailed {
120            package: package.to_string(),
121        }
122    }
123
124    /// Create a UnknownBuildSystem error
125    pub fn unknown_build_system(package: &str) -> Self {
126        BuildError::UnknownBuildSystem {
127            package: package.to_string(),
128        }
129    }
130}
131
132pub type Result<T> = std::result::Result<T, Error>;