Skip to content

Commit c46ba9c

Browse files
committed
feat(add): check if given crate argument would be valid with inserted @ symbol, suggest fixed argument
1 parent 2a9d0ad commit c46ba9c

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

src/bin/cargo/commands/install.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ pub fn exec(gctx: &mut GlobalContext, args: &ArgMatches) -> CliResult {
148148
}
149149
}
150150
}
151-
151+
152152
if let Some(toolchain) = crate_name.strip_prefix("+") {
153153
return Err(anyhow!(
154154
"invalid character `+` in package name: `+{toolchain}`

src/cargo/ops/cargo_add/crate_spec.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,23 @@ impl CrateSpec {
2828
.map(|(n, v)| (n, Some(v)))
2929
.unwrap_or((pkg_id, None));
3030

31-
PackageName::new(name)?;
31+
let package_name = PackageName::new(name);
32+
if !pkg_id.contains("@") && package_name.is_err() {
33+
for (idx, ch) in pkg_id.char_indices() {
34+
if !(unicode_xid::UnicodeXID::is_xid_continue(ch) || ch == '-') {
35+
let mut suggested_pkg_id = pkg_id.to_string();
36+
suggested_pkg_id.insert_str(idx, "@");
37+
if let Ok(_) = CrateSpec::resolve(&suggested_pkg_id.as_str()) {
38+
return Err(anyhow::anyhow!(
39+
"possible missing `@` detected in package name `{pkg_id}`. Try `{suggested_pkg_id}` instead."
40+
))
41+
.into();
42+
}
43+
}
44+
}
45+
}
46+
47+
package_name?;
3248

3349
if let Some(version) = version {
3450
semver::VersionReq::parse(version)

tests/testsuite/cargo_add/missing_at_in_crate_spec/stderr.term.svg

Lines changed: 2 additions & 2 deletions
Loading

0 commit comments

Comments
 (0)