Skip to content

Commit 1fbbde7

Browse files
committed
fix(manifest): Improve rust-version error messages
Since we have tests for a couple of cases, I figured we could improve the error messages for them.
1 parent 188f8f8 commit 1fbbde7

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

src/cargo/util/semver_ext.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,18 @@ impl std::str::FromStr for PartialVersion {
136136
// HACK: `PartialVersion` is a subset of the `VersionReq` syntax that only ever
137137
// has one comparator with a required minor and optional patch, and uses no
138138
// other features.
139+
if is_req(value) {
140+
anyhow::bail!("unexpected version requirement, expected a version like \"1.32\"")
141+
}
139142
let version_req = match semver::VersionReq::parse(value) {
140143
// Exclude semver operators like `^` and pre-release identifiers
141144
Ok(req) if value.chars().all(|c| c.is_ascii_digit() || c == '.') => req,
145+
Err(_) if value.contains('+') => {
146+
anyhow::bail!("unexpected build field, expected a version like \"1.32\"")
147+
}
148+
Err(_) if value.contains('-') => {
149+
anyhow::bail!("unexpected prerelease field, expected a version like \"1.32\"")
150+
}
142151
_ => anyhow::bail!("expected a version like \"1.32\""),
143152
};
144153
assert_eq!(
@@ -211,6 +220,13 @@ impl<'de> serde::Deserialize<'de> for PartialVersion {
211220
}
212221
}
213222

223+
fn is_req(value: &str) -> bool {
224+
let Some(first) = value.chars().next() else {
225+
return false;
226+
};
227+
"<>=^~".contains(first) || value.contains('*') || value.contains(',')
228+
}
229+
214230
#[cfg(test)]
215231
mod tests {
216232
use super::*;

tests/testsuite/rust_version.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ fn rust_version_bad_caret() {
4848
error: failed to parse manifest at `[..]`
4949
5050
Caused by:
51-
expected a version like \"1.32\"
51+
unexpected version requirement, expected a version like \"1.32\"
5252
in `package.rust-version`",
5353
)
5454
.run();
@@ -78,7 +78,7 @@ fn rust_version_bad_pre_release() {
7878
error: failed to parse manifest at `[..]`
7979
8080
Caused by:
81-
expected a version like \"1.32\"
81+
unexpected prerelease field, expected a version like \"1.32\"
8282
in `package.rust-version`",
8383
)
8484
.run();

0 commit comments

Comments
 (0)