1
+ use std:: collections:: HashMap ;
1
2
use std:: fs:: { self , File } ;
2
3
use std:: io:: prelude:: * ;
3
4
use std:: path:: { PathBuf , Path } ;
@@ -6,6 +7,7 @@ use flate2::Compression::Default;
6
7
use flate2:: write:: GzEncoder ;
7
8
use git2;
8
9
use rustc_serialize:: hex:: ToHex ;
10
+ use rustc_serialize:: json:: ToJson ;
9
11
use tar:: { Builder , Header } ;
10
12
use url:: Url ;
11
13
@@ -21,9 +23,18 @@ pub fn dl_url() -> Url { Url::from_file_path(&*dl_path()).ok().unwrap() }
21
23
pub struct Package {
22
24
name : String ,
23
25
vers : String ,
24
- deps : Vec < ( String , String , & ' static str , String ) > ,
26
+ deps : Vec < Dependency > ,
25
27
files : Vec < ( String , String ) > ,
26
28
yanked : bool ,
29
+ features : HashMap < String , Vec < String > > ,
30
+ }
31
+
32
+ struct Dependency {
33
+ name : String ,
34
+ vers : String ,
35
+ kind : String ,
36
+ target : Option < String > ,
37
+ features : Vec < String > ,
27
38
}
28
39
29
40
fn init ( ) {
@@ -55,6 +66,7 @@ impl Package {
55
66
deps : Vec :: new ( ) ,
56
67
files : Vec :: new ( ) ,
57
68
yanked : false ,
69
+ features : HashMap :: new ( ) ,
58
70
}
59
71
}
60
72
@@ -64,23 +76,40 @@ impl Package {
64
76
}
65
77
66
78
pub fn dep ( & mut self , name : & str , vers : & str ) -> & mut Package {
67
- self . deps . push ( ( name. to_string ( ) , vers. to_string ( ) , "normal" ,
68
- "null" . to_string ( ) ) ) ;
69
- self
79
+ self . full_dep ( name, vers, None , "normal" , & [ ] )
80
+ }
81
+
82
+ pub fn feature_dep ( & mut self ,
83
+ name : & str ,
84
+ vers : & str ,
85
+ features : & [ & str ] ) -> & mut Package {
86
+ self . full_dep ( name, vers, None , "normal" , features)
70
87
}
71
88
72
89
pub fn target_dep ( & mut self ,
73
90
name : & str ,
74
91
vers : & str ,
75
92
target : & str ) -> & mut Package {
76
- self . deps . push ( ( name. to_string ( ) , vers. to_string ( ) , "normal" ,
77
- format ! ( "\" {}\" " , target) ) ) ;
78
- self
93
+ self . full_dep ( name, vers, Some ( target) , "normal" , & [ ] )
79
94
}
80
95
81
96
pub fn dev_dep ( & mut self , name : & str , vers : & str ) -> & mut Package {
82
- self . deps . push ( ( name. to_string ( ) , vers. to_string ( ) , "dev" ,
83
- "null" . to_string ( ) ) ) ;
97
+ self . full_dep ( name, vers, None , "dev" , & [ ] )
98
+ }
99
+
100
+ fn full_dep ( & mut self ,
101
+ name : & str ,
102
+ vers : & str ,
103
+ target : Option < & str > ,
104
+ kind : & str ,
105
+ features : & [ & str ] ) -> & mut Package {
106
+ self . deps . push ( Dependency {
107
+ name : name. to_string ( ) ,
108
+ vers : vers. to_string ( ) ,
109
+ kind : kind. to_string ( ) ,
110
+ target : target. map ( |s| s. to_string ( ) ) ,
111
+ features : features. iter ( ) . map ( |s| s. to_string ( ) ) . collect ( ) ,
112
+ } ) ;
84
113
self
85
114
}
86
115
@@ -89,30 +118,36 @@ impl Package {
89
118
self
90
119
}
91
120
92
- #[ allow( deprecated) ] // connect => join in 1.3
93
121
pub fn publish ( & self ) {
94
122
self . make_archive ( ) ;
95
123
96
124
// Figure out what we're going to write into the index
97
- let deps = self . deps . iter ( ) . map ( |& ( ref name, ref req, ref kind, ref target) | {
98
- format ! ( "{{\" name\" :\" {}\" ,\
99
- \" req\" :\" {}\" ,\
100
- \" features\" :[],\
101
- \" default_features\" :false,\
102
- \" target\" :{},\
103
- \" optional\" :false,\
104
- \" kind\" :\" {}\" }}", name, req, target, kind)
105
- } ) . collect :: < Vec < _ > > ( ) . connect ( "," ) ;
125
+ let deps = self . deps . iter ( ) . map ( |dep| {
126
+ let mut map = HashMap :: new ( ) ;
127
+ map. insert ( "name" . to_string ( ) , dep. name . to_json ( ) ) ;
128
+ map. insert ( "req" . to_string ( ) , dep. vers . to_json ( ) ) ;
129
+ map. insert ( "features" . to_string ( ) , dep. features . to_json ( ) ) ;
130
+ map. insert ( "default_features" . to_string ( ) , false . to_json ( ) ) ;
131
+ map. insert ( "target" . to_string ( ) , dep. target . to_json ( ) ) ;
132
+ map. insert ( "optional" . to_string ( ) , false . to_json ( ) ) ;
133
+ map. insert ( "kind" . to_string ( ) , dep. kind . to_json ( ) ) ;
134
+ map
135
+ } ) . collect :: < Vec < _ > > ( ) ;
106
136
let cksum = {
107
137
let mut c = Vec :: new ( ) ;
108
138
File :: open ( & self . archive_dst ( ) ) . unwrap ( )
109
139
. read_to_end ( & mut c) . unwrap ( ) ;
110
140
cksum ( & c)
111
141
} ;
112
- let line = format ! ( "{{\" name\" :\" {}\" ,\" vers\" :\" {}\" ,\
113
- \" deps\" :[{}],\" cksum\" :\" {}\" ,\" features\" :{{}},\
114
- \" yanked\" :{}}}",
115
- self . name, self . vers, deps, cksum, self . yanked) ;
142
+ let mut dep = HashMap :: new ( ) ;
143
+ dep. insert ( "name" . to_string ( ) , self . name . to_json ( ) ) ;
144
+ dep. insert ( "vers" . to_string ( ) , self . vers . to_json ( ) ) ;
145
+ dep. insert ( "deps" . to_string ( ) , deps. to_json ( ) ) ;
146
+ dep. insert ( "cksum" . to_string ( ) , cksum. to_json ( ) ) ;
147
+ dep. insert ( "features" . to_string ( ) , self . features . to_json ( ) ) ;
148
+ dep. insert ( "yanked" . to_string ( ) , self . yanked . to_json ( ) ) ;
149
+ let line = dep. to_json ( ) . to_string ( ) ;
150
+
116
151
let file = match self . name . len ( ) {
117
152
1 => format ! ( "1/{}" , self . name) ,
118
153
2 => format ! ( "2/{}" , self . name) ,
@@ -152,20 +187,20 @@ impl Package {
152
187
version = "{}"
153
188
authors = []
154
189
"# , self . name, self . vers) ;
155
- for & ( ref dep, ref req , kind , ref target ) in self . deps . iter ( ) {
156
- let target = match & target [ .. ] {
157
- "null" => String :: new ( ) ,
158
- t => format ! ( "target.{}." , t ) ,
190
+ for dep in self . deps . iter ( ) {
191
+ let target = match dep . target {
192
+ None => String :: new ( ) ,
193
+ Some ( ref s ) => format ! ( "target.{}." , s ) ,
159
194
} ;
160
- let kind = match kind {
195
+ let kind = match & dep . kind [ .. ] {
161
196
"build" => "build-" ,
162
197
"dev" => "dev-" ,
163
198
_ => ""
164
199
} ;
165
200
manifest. push_str ( & format ! ( r#"
166
201
[{}{}dependencies.{}]
167
202
version = "{}"
168
- "# , target, kind, dep, req ) ) ;
203
+ "# , target, kind, dep. name , dep . vers ) ) ;
169
204
}
170
205
171
206
let dst = self . archive_dst ( ) ;
0 commit comments