Skip to content

Commit 9bfdfd9

Browse files
committed
fix: improve error messages with project context
1 parent 0683fbf commit 9bfdfd9

File tree

1 file changed

+38
-11
lines changed

1 file changed

+38
-11
lines changed

src/update_info/forge.rs

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,26 @@ use releasekit::{Filter, Forge, Release};
88
use crate::config;
99
use crate::error::{Error, Result};
1010

11+
fn forge_error(e: releasekit::Error, project: &str) -> Error {
12+
let msg = match &e {
13+
releasekit::Error::Http { status, url } => {
14+
format!("HTTP {status} from {url}")
15+
}
16+
releasekit::Error::Network(detail) => {
17+
let detail = detail.strip_prefix("io: ").unwrap_or(detail);
18+
format!("failed to connect to release server for {project}: {detail}")
19+
}
20+
releasekit::Error::NoReleases => {
21+
format!("no releases found for {project}")
22+
}
23+
releasekit::Error::NoMatchingAsset => {
24+
format!("no matching asset found for {project}")
25+
}
26+
_ => format!("{e}"),
27+
};
28+
Error::ForgeApi(msg)
29+
}
30+
1131
#[derive(Debug, Clone)]
1232
pub enum ForgeKind {
1333
GitHub,
@@ -62,7 +82,7 @@ impl ForgeUpdateInfo {
6282
self.with_forge(|forge| {
6383
forge
6484
.fetch_releases(&project, None)
65-
.map_err(|e| Error::ForgeApi(e.to_string()))
85+
.map_err(|e| forge_error(e, &project))
6686
})
6787
}
6888

@@ -149,7 +169,7 @@ impl ForgeUpdateInfo {
149169

150170
let releases = forge
151171
.fetch_releases(&project, tag)
152-
.map_err(|e| Error::ForgeApi(e.to_string()))?;
172+
.map_err(|e| forge_error(e, &project))?;
153173

154174
let release = self.select_release(releases, tag.is_some(), find_prerelease)?;
155175

@@ -162,32 +182,36 @@ impl ForgeUpdateInfo {
162182
is_specific_tag: bool,
163183
find_prerelease: bool,
164184
) -> Result<Release> {
185+
let project = format!("{}/{}", self.owner, self.repo);
186+
165187
if is_specific_tag {
166-
return releases
167-
.into_iter()
168-
.next()
169-
.ok_or_else(|| Error::ForgeApi("No release found for tag".into()));
188+
return releases.into_iter().next().ok_or_else(|| {
189+
Error::ForgeApi(format!(
190+
"no release found for tag '{}' in {project}",
191+
self.tag
192+
))
193+
});
170194
}
171195

172196
if find_prerelease {
173197
return releases
174198
.into_iter()
175199
.find(|r| r.is_prerelease())
176-
.ok_or_else(|| Error::ForgeApi("No prerelease found".into()));
200+
.ok_or_else(|| Error::ForgeApi(format!("no prerelease found for {project}")));
177201
}
178202

179203
if self.tag == "latest" {
180204
return releases
181205
.into_iter()
182206
.find(|r| !r.is_prerelease())
183-
.ok_or_else(|| Error::ForgeApi("No stable release found".into()));
207+
.ok_or_else(|| Error::ForgeApi(format!("no stable release found for {project}")));
184208
}
185209

186210
// latest-all: first release regardless
187211
releases
188212
.into_iter()
189213
.next()
190-
.ok_or_else(|| Error::ForgeApi("No release found".into()))
214+
.ok_or_else(|| Error::ForgeApi(format!("no releases found for {project}")))
191215
}
192216

193217
fn find_matching_asset(&self, release: &Release) -> Result<String> {
@@ -202,8 +226,11 @@ impl ForgeUpdateInfo {
202226

203227
if matching.is_empty() {
204228
return Err(Error::ForgeApi(format!(
205-
"No asset matched pattern: *{}",
206-
self.filename
229+
"no asset matching '*{}' in release {} of {}/{}",
230+
self.filename,
231+
release.tag(),
232+
self.owner,
233+
self.repo
207234
)));
208235
}
209236

0 commit comments

Comments
 (0)