@@ -5,6 +5,7 @@ use semver::Version;
5
5
use serde:: { de, ser} ;
6
6
use url:: Url ;
7
7
8
+ use crate :: core:: interning:: InternedString ;
8
9
use crate :: core:: PackageId ;
9
10
use crate :: util:: errors:: { CargoResult , CargoResultExt } ;
10
11
use crate :: util:: { validate_package_name, ToSemver , ToUrl } ;
@@ -20,7 +21,7 @@ use crate::util::{validate_package_name, ToSemver, ToUrl};
20
21
/// sufficient to uniquely define a package ID.
21
22
#[ derive( Clone , PartialEq , Eq , Debug , Hash , Ord , PartialOrd ) ]
22
23
pub struct PackageIdSpec {
23
- name : String ,
24
+ name : InternedString ,
24
25
version : Option < Version > ,
25
26
url : Option < Url > ,
26
27
}
@@ -66,7 +67,7 @@ impl PackageIdSpec {
66
67
} ;
67
68
validate_package_name ( name, "pkgid" , "" ) ?;
68
69
Ok ( PackageIdSpec {
69
- name : name . to_string ( ) ,
70
+ name : InternedString :: new ( name ) ,
70
71
version,
71
72
url : None ,
72
73
} )
@@ -86,7 +87,7 @@ impl PackageIdSpec {
86
87
/// fields filled in.
87
88
pub fn from_package_id ( package_id : PackageId ) -> PackageIdSpec {
88
89
PackageIdSpec {
89
- name : package_id. name ( ) . to_string ( ) ,
90
+ name : package_id. name ( ) ,
90
91
version : Some ( package_id. version ( ) . clone ( ) ) ,
91
92
url : Some ( package_id. source_id ( ) . url ( ) . clone ( ) ) ,
92
93
}
@@ -117,19 +118,19 @@ impl PackageIdSpec {
117
118
match parts. next ( ) {
118
119
Some ( part) => {
119
120
let version = part. to_semver ( ) ?;
120
- ( name_or_version . to_string ( ) , Some ( version) )
121
+ ( InternedString :: new ( name_or_version ) , Some ( version) )
121
122
}
122
123
None => {
123
124
if name_or_version. chars ( ) . next ( ) . unwrap ( ) . is_alphabetic ( ) {
124
- ( name_or_version . to_string ( ) , None )
125
+ ( InternedString :: new ( name_or_version ) , None )
125
126
} else {
126
127
let version = name_or_version. to_semver ( ) ?;
127
- ( path_name . to_string ( ) , Some ( version) )
128
+ ( InternedString :: new ( path_name ) , Some ( version) )
128
129
}
129
130
}
130
131
}
131
132
}
132
- None => ( path_name . to_string ( ) , None ) ,
133
+ None => ( InternedString :: new ( path_name ) , None ) ,
133
134
}
134
135
} ;
135
136
Ok ( PackageIdSpec {
@@ -139,8 +140,8 @@ impl PackageIdSpec {
139
140
} )
140
141
}
141
142
142
- pub fn name ( & self ) -> & str {
143
- & self . name
143
+ pub fn name ( & self ) -> InternedString {
144
+ self . name
144
145
}
145
146
146
147
pub fn version ( & self ) -> Option < & Version > {
@@ -157,7 +158,7 @@ impl PackageIdSpec {
157
158
158
159
/// Checks whether the given `PackageId` matches the `PackageIdSpec`.
159
160
pub fn matches ( & self , package_id : PackageId ) -> bool {
160
- if self . name ( ) != & * package_id. name ( ) {
161
+ if self . name ( ) != package_id. name ( ) {
161
162
return false ;
162
163
}
163
164
@@ -234,7 +235,7 @@ impl fmt::Display for PackageIdSpec {
234
235
} else {
235
236
write ! ( f, "{}" , url) ?;
236
237
}
237
- if url. path_segments ( ) . unwrap ( ) . next_back ( ) . unwrap ( ) != self . name {
238
+ if url. path_segments ( ) . unwrap ( ) . next_back ( ) . unwrap ( ) != & * self . name {
238
239
printed_name = true ;
239
240
write ! ( f, "#{}" , self . name) ?;
240
241
}
@@ -273,6 +274,7 @@ impl<'de> de::Deserialize<'de> for PackageIdSpec {
273
274
#[ cfg( test) ]
274
275
mod tests {
275
276
use super :: PackageIdSpec ;
277
+ use crate :: core:: interning:: InternedString ;
276
278
use crate :: core:: { PackageId , SourceId } ;
277
279
use crate :: util:: ToSemver ;
278
280
use url:: Url ;
@@ -288,63 +290,63 @@ mod tests {
288
290
ok (
289
291
"https://crates.io/foo#1.2.3" ,
290
292
PackageIdSpec {
291
- name : "foo" . to_string ( ) ,
293
+ name : InternedString :: new ( "foo" ) ,
292
294
version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
293
295
url : Some ( Url :: parse ( "https://crates.io/foo" ) . unwrap ( ) ) ,
294
296
} ,
295
297
) ;
296
298
ok (
297
299
"https://crates.io/foo#bar:1.2.3" ,
298
300
PackageIdSpec {
299
- name : "bar" . to_string ( ) ,
301
+ name : InternedString :: new ( "bar" ) ,
300
302
version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
301
303
url : Some ( Url :: parse ( "https://crates.io/foo" ) . unwrap ( ) ) ,
302
304
} ,
303
305
) ;
304
306
ok (
305
307
"crates.io/foo" ,
306
308
PackageIdSpec {
307
- name : "foo" . to_string ( ) ,
309
+ name : InternedString :: new ( "foo" ) ,
308
310
version : None ,
309
311
url : Some ( Url :: parse ( "cargo://crates.io/foo" ) . unwrap ( ) ) ,
310
312
} ,
311
313
) ;
312
314
ok (
313
315
"crates.io/foo#1.2.3" ,
314
316
PackageIdSpec {
315
- name : "foo" . to_string ( ) ,
317
+ name : InternedString :: new ( "foo" ) ,
316
318
version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
317
319
url : Some ( Url :: parse ( "cargo://crates.io/foo" ) . unwrap ( ) ) ,
318
320
} ,
319
321
) ;
320
322
ok (
321
323
"crates.io/foo#bar" ,
322
324
PackageIdSpec {
323
- name : "bar" . to_string ( ) ,
325
+ name : InternedString :: new ( "bar" ) ,
324
326
version : None ,
325
327
url : Some ( Url :: parse ( "cargo://crates.io/foo" ) . unwrap ( ) ) ,
326
328
} ,
327
329
) ;
328
330
ok (
329
331
"crates.io/foo#bar:1.2.3" ,
330
332
PackageIdSpec {
331
- name : "bar" . to_string ( ) ,
333
+ name : InternedString :: new ( "bar" ) ,
332
334
version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
333
335
url : Some ( Url :: parse ( "cargo://crates.io/foo" ) . unwrap ( ) ) ,
334
336
} ,
335
337
) ;
336
338
ok (
337
339
"foo" ,
338
340
PackageIdSpec {
339
- name : "foo" . to_string ( ) ,
341
+ name : InternedString :: new ( "foo" ) ,
340
342
version : None ,
341
343
url : None ,
342
344
} ,
343
345
) ;
344
346
ok (
345
347
"foo:1.2.3" ,
346
348
PackageIdSpec {
347
- name : "foo" . to_string ( ) ,
349
+ name : InternedString :: new ( "foo" ) ,
348
350
version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
349
351
url : None ,
350
352
} ,
0 commit comments