|
12 | 12 | use crate::core::resolver::context::Context;
|
13 | 13 | use crate::core::resolver::errors::describe_path;
|
14 | 14 | use crate::core::resolver::types::{ConflictReason, DepInfo, FeaturesSet};
|
15 |
| -use crate::core::resolver::{ActivateError, ActivateResult, ResolveOpts}; |
| 15 | +use crate::core::resolver::{ |
| 16 | + ActivateError, ActivateResult, CliFeatures, RequestedFeatures, ResolveOpts, |
| 17 | +}; |
16 | 18 | use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec, Registry, Summary};
|
17 | 19 | use crate::util::errors::{CargoResult, CargoResultExt};
|
18 | 20 | use crate::util::interning::InternedString;
|
@@ -281,15 +283,6 @@ pub fn resolve_features<'b>(
|
281 | 283 | .unwrap_or(&default_dep)
|
282 | 284 | .clone();
|
283 | 285 | base.extend(dep.features().iter());
|
284 |
| - for feature in base.iter() { |
285 |
| - if feature.contains('/') { |
286 |
| - return Err(anyhow::format_err!( |
287 |
| - "feature names may not contain slashes: `{}`", |
288 |
| - feature |
289 |
| - ) |
290 |
| - .into()); |
291 |
| - } |
292 |
| - } |
293 | 286 | ret.push((dep.clone(), Rc::new(base)));
|
294 | 287 | }
|
295 | 288 |
|
@@ -317,30 +310,46 @@ fn build_requirements<'a, 'b: 'a>(
|
317 | 310 | ) -> ActivateResult<Requirements<'a>> {
|
318 | 311 | let mut reqs = Requirements::new(s);
|
319 | 312 |
|
320 |
| - if opts.features.all_features { |
321 |
| - for key in s.features().keys() { |
322 |
| - if let Err(e) = reqs.require_feature(*key) { |
| 313 | + let handle_default = |uses_default_features, reqs: &mut Requirements<'_>| { |
| 314 | + if uses_default_features && s.features().contains_key("default") { |
| 315 | + if let Err(e) = reqs.require_feature(InternedString::new("default")) { |
323 | 316 | return Err(e.into_activate_error(parent, s));
|
324 | 317 | }
|
325 | 318 | }
|
326 |
| - } else { |
327 |
| - for &f in opts.features.features.iter() { |
328 |
| - let fv = FeatureValue::new(f); |
329 |
| - if fv.has_dep_prefix() { |
330 |
| - return Err(ActivateError::Fatal(anyhow::format_err!( |
331 |
| - "feature value `{}` is not allowed to use explicit `dep:` syntax", |
332 |
| - fv |
333 |
| - ))); |
334 |
| - } |
335 |
| - if let Err(e) = reqs.require_value(&fv) { |
336 |
| - return Err(e.into_activate_error(parent, s)); |
| 319 | + Ok(()) |
| 320 | + }; |
| 321 | + |
| 322 | + match &opts.features { |
| 323 | + RequestedFeatures::CliFeatures(CliFeatures { |
| 324 | + features, |
| 325 | + all_features, |
| 326 | + uses_default_features, |
| 327 | + }) => { |
| 328 | + if *all_features { |
| 329 | + for key in s.features().keys() { |
| 330 | + if let Err(e) = reqs.require_feature(*key) { |
| 331 | + return Err(e.into_activate_error(parent, s)); |
| 332 | + } |
| 333 | + } |
| 334 | + } else { |
| 335 | + for fv in features.iter() { |
| 336 | + if let Err(e) = reqs.require_value(&fv) { |
| 337 | + return Err(e.into_activate_error(parent, s)); |
| 338 | + } |
| 339 | + } |
| 340 | + handle_default(*uses_default_features, &mut reqs)?; |
337 | 341 | }
|
338 | 342 | }
|
339 |
| - } |
340 |
| - |
341 |
| - if opts.features.uses_default_features && s.features().contains_key("default") { |
342 |
| - if let Err(e) = reqs.require_feature(InternedString::new("default")) { |
343 |
| - return Err(e.into_activate_error(parent, s)); |
| 343 | + RequestedFeatures::DepFeatures { |
| 344 | + features, |
| 345 | + uses_default_features, |
| 346 | + } => { |
| 347 | + for feature in features.iter() { |
| 348 | + if let Err(e) = reqs.require_feature(*feature) { |
| 349 | + return Err(e.into_activate_error(parent, s)); |
| 350 | + } |
| 351 | + } |
| 352 | + handle_default(*uses_default_features, &mut reqs)?; |
344 | 353 | }
|
345 | 354 | }
|
346 | 355 |
|
|
0 commit comments