Skip to content

Commit a8010c2

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

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

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+
let err = package_name.unwrap_err();
39+
return Err(
40+
anyhow::format_err!("{err}\n\n\
41+
help: if this is meant to be a package name followed by a version, insert an `@` like `{suggested_pkg_id}`").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/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ fn case() {
2121
.stderr_eq(file!["stderr.term.svg"]);
2222

2323
assert_ui().subset_matches(current_dir!().join("out"), &project_root);
24-
}
24+
}

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

Lines changed: 5 additions & 1 deletion
Loading

0 commit comments

Comments
 (0)