]>
Commit | Line | Data |
---|---|---|
2b46d039 AC |
1 | use std::collections::HashMap; |
2 | ||
c96d936b | 3 | use semver::Version; |
2b46d039 AC |
4 | use core::{Dependency, PackageId, SourceId}; |
5 | ||
6 | use util::{CargoResult, human}; | |
1ce76415 | 7 | |
64ff29ff | 8 | /// Summaries are cloned, and should not be mutated after creation |
c041e8ec | 9 | #[deriving(Show,Clone,PartialEq)] |
1ce76415 | 10 | pub struct Summary { |
61c95b75 | 11 | package_id: PackageId, |
2b46d039 AC |
12 | dependencies: Vec<Dependency>, |
13 | features: HashMap<String, Vec<String>>, | |
1ce76415 CL |
14 | } |
15 | ||
16 | impl Summary { | |
2b46d039 AC |
17 | pub fn new(pkg_id: PackageId, |
18 | dependencies: Vec<Dependency>, | |
19 | features: HashMap<String, Vec<String>>) -> CargoResult<Summary> { | |
20 | for dep in dependencies.iter() { | |
21 | if features.find_equiv(&dep.get_name()).is_some() { | |
22 | return Err(human(format!("Features and dependencies cannot have \ | |
23 | the same name: `{}`", dep.get_name()))) | |
24 | } | |
25 | if dep.is_optional() && !dep.is_transitive() { | |
26 | return Err(human(format!("Dev-dependencies are not allowed \ | |
27 | to be optional: `{}`", | |
28 | dep.get_name()))) | |
29 | } | |
30 | } | |
31 | for (feature, list) in features.iter() { | |
32 | for dep in list.iter() { | |
33 | if features.find_equiv(&dep.as_slice()).is_some() { continue } | |
34 | let d = dependencies.iter().find(|d| { | |
35 | d.get_name() == dep.as_slice() | |
36 | }); | |
37 | match d { | |
38 | Some(d) => { | |
39 | if d.is_optional() { continue } | |
40 | return Err(human(format!("Feature `{}` depends on `{}` \ | |
41 | which is not an optional \ | |
42 | dependency.\nConsider adding \ | |
43 | `optional = true` to the \ | |
44 | dependency", feature, dep))) | |
45 | } | |
46 | None => { | |
47 | return Err(human(format!("Feature `{}` includes `{}` \ | |
48 | which is neither a dependency \ | |
49 | nor another feature", | |
50 | feature, dep))) | |
51 | } | |
52 | } | |
53 | } | |
1ce76415 | 54 | } |
2b46d039 AC |
55 | Ok(Summary { |
56 | package_id: pkg_id, | |
57 | dependencies: dependencies, | |
58 | features: features, | |
59 | }) | |
1ce76415 CL |
60 | } |
61 | ||
c0d2b79e | 62 | pub fn get_package_id(&self) -> &PackageId { |
61c95b75 | 63 | &self.package_id |
1ce76415 CL |
64 | } |
65 | ||
c0d2b79e | 66 | pub fn get_name(&self) -> &str { |
61c95b75 | 67 | self.get_package_id().get_name() |
8f6d4afb CL |
68 | } |
69 | ||
c0d2b79e | 70 | pub fn get_version(&self) -> &Version { |
61c95b75 | 71 | self.get_package_id().get_version() |
c96d936b CL |
72 | } |
73 | ||
c0d2b79e | 74 | pub fn get_source_id(&self) -> &SourceId { |
46f90ba5 YKCL |
75 | self.package_id.get_source_id() |
76 | } | |
77 | ||
c0d2b79e | 78 | pub fn get_dependencies(&self) -> &[Dependency] { |
1ce76415 CL |
79 | self.dependencies.as_slice() |
80 | } | |
2b46d039 AC |
81 | |
82 | pub fn get_features(&self) -> &HashMap<String, Vec<String>> { | |
83 | &self.features | |
84 | } | |
1ce76415 | 85 | } |
da0ec9a3 YK |
86 | |
87 | pub trait SummaryVec { | |
2f576175 | 88 | fn names(&self) -> Vec<String>; |
da0ec9a3 YK |
89 | } |
90 | ||
91 | impl SummaryVec for Vec<Summary> { | |
2f576175 YK |
92 | // TODO: Move to Registry |
93 | fn names(&self) -> Vec<String> { | |
139e81ea | 94 | self.iter().map(|summary| summary.get_name().to_string()).collect() |
da0ec9a3 YK |
95 | } |
96 | ||
da0ec9a3 | 97 | } |