1use 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#[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 pub fn configure_failed(package: &str) -> Self {
105 BuildError::ConfigureFailed {
106 package: package.to_string(),
107 }
108 }
109
110 pub fn make_failed(package: &str) -> Self {
112 BuildError::MakeFailed {
113 package: package.to_string(),
114 }
115 }
116
117 pub fn make_install_failed(package: &str) -> Self {
119 BuildError::MakeInstallFailed {
120 package: package.to_string(),
121 }
122 }
123
124 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>;