{"id":"779ad84ea992cc7c","repo":"rust-lang/cargo","slug":"dependency-name-is-required","errorCode":null,"errorMessage":"dependency name is required","messagePattern":"dependency name is required","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/ops/cargo_add/mod.rs","lineNumber":432,"sourceCode":"                    \"translating `{}` to `{}`\",\n                    dependency.name, selected.name,\n                ))?;\n            }\n            selected\n        } else {\n            let source = crate::sources::PathSource::new(&src.path, src.source_id()?, gctx);\n            let package = source.root_package()?;\n            let mut selected = Dependency::from(package.summary());\n            if let Some(Source::Path(selected_src)) = &mut selected.source {\n                selected_src.base = src.base;\n            }\n            selected\n        };\n        selected\n    } else if let Some(crate_spec) = &crate_spec {\n        crate_spec.to_dependency()?\n    } else {\n        anyhow::bail!(\"dependency name is required\");\n    };\n    selected_dep = populate_dependency(selected_dep, arg);\n\n    let lookup = |dep_key: &_| {\n        get_existing_dependency(\n            ws,\n            spec.manifest().unstable_features(),\n            manifest,\n            dep_key,\n            section,\n        )\n    };\n    let old_dep = fuzzy_lookup(&mut selected_dep, lookup, gctx)?;\n    let mut dependency = if let Some(mut old_dep) = old_dep.clone() {\n        if old_dep.name != selected_dep.name {\n            // Assuming most existing keys are not relevant when the package changes\n            if selected_dep.optional.is_none() {\n                selected_dep.optional = old_dep.optional;","sourceCodeStart":414,"sourceCodeEnd":450,"githubUrl":"https://github.com/rust-lang/cargo/blob/0e07a155371a6ce88ae53a2c00df940280c09a67/src/ops/cargo_add/mod.rs#L414-L450","documentation":"`cargo add` requires at least a crate specifier, a `--git`, or a `--path` to know which dependency to add. If all three are absent the resolver reaches the final `else` branch at mod.rs:432 and bails with \"dependency name is required\". This guards against an empty/no-op `DepOp` reaching the registry query stage.","triggerScenarios":"A `DepOp` constructed with `crate_spec: None`, `git: None`, `path: None` (e.g. only flags like `--features` or `--optional` with no target), or a CLI invocation like `cargo add --features foo` with no crate name.","commonSituations":"Programmatic callers building `DepOp` to tweak an existing dependency without naming it, or shell alias mishaps that drop the positional crate argument.","solutions":["Supply a crate name: `cargo add <name>` or set `DepOp.crate_spec = Some(\"name\".into())`.","If you meant to modify an existing dependency rather than add one, use `cargo add <existing-name>` (it merges) — you still must name it.","Validate `DepOp` before calling `add()` by asserting at least one of `crate_spec`, `git`, `path` is `Some`."],"exampleFix":"// before\nlet op = DepOp { crate_spec: None, git: None, path: None, ..Default::default() };\n\n// after\nlet op = DepOp { crate_spec: Some(\"serde\".into()), ..Default::default() };","handlingStrategy":"type-guard","validationCode":"// Ensure the DepOp names a source before calling add().\nfn dep_op_has_target(op: &DepOp) -> bool {\n    op.crate_spec.is_some() || op.git.is_some() || op.path.is_some()\n}\n\n// assert!(dep_op_has_target(&op), \"DepOp needs crate_spec, git, or path\");","typeGuard":"// Newtype that statically guarantees a target is present.\nstruct AddableDepOp { inner: DepOp }\nimpl AddableDepOp {\n    fn new(op: DepOp) -> Result<Self, &'static str> {\n        match (op.crate_spec.is_some(), op.git.is_some(), op.path.is_some()) {\n            (true, _, _) | (_, true, _) | (_, _, true) => Ok(Self { inner: op }),\n            _ => Err(\"DepOp requires crate_spec, git, or path\"),\n        }\n    }\n}","tryCatchPattern":null,"preventionTips":["Wrap DepOp construction in a builder that requires a source before it returns Ok.","In CLI arg parsing, treat a missing positional crate as a hard usage error.","Unit-test your DepOp factory to assert it never emits an all-None triple."],"tags":["cargo-add","validation","missing-argument"],"analyzedSha":"0e07a155371a6ce88ae53a2c00df940280c09a67","analyzedAt":"2026-08-06T01:46:58.334Z","schemaVersion":2}