]> git.proxmox.com Git - cargo.git/blame - src/cargo/core/summary.rs
auto merge of #709 : alexcrichton/cargo/issue-705, r=brson
[cargo.git] / src / cargo / core / summary.rs
CommitLineData
2b46d039
AC
1use std::collections::HashMap;
2
c96d936b 3use semver::Version;
2b46d039
AC
4use core::{Dependency, PackageId, SourceId};
5
6use util::{CargoResult, human};
1ce76415 7
64ff29ff 8/// Summaries are cloned, and should not be mutated after creation
c041e8ec 9#[deriving(Show,Clone,PartialEq)]
1ce76415 10pub struct Summary {
61c95b75 11 package_id: PackageId,
2b46d039
AC
12 dependencies: Vec<Dependency>,
13 features: HashMap<String, Vec<String>>,
1ce76415
CL
14}
15
16impl 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
87pub trait SummaryVec {
2f576175 88 fn names(&self) -> Vec<String>;
da0ec9a3
YK
89}
90
91impl 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}