|
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