@@ -5,6 +5,7 @@ use semver::Version;
55use serde:: { de, ser} ;
66use url:: Url ;
77
8+ use crate :: core:: interning:: InternedString ;
89use crate :: core:: PackageId ;
910use crate :: util:: errors:: { CargoResult , CargoResultExt } ;
1011use crate :: util:: { validate_package_name, ToSemver , ToUrl } ;
@@ -20,7 +21,7 @@ use crate::util::{validate_package_name, ToSemver, ToUrl};
2021/// sufficient to uniquely define a package ID.
2122#[ derive( Clone , PartialEq , Eq , Debug , Hash , Ord , PartialOrd ) ]
2223pub struct PackageIdSpec {
23- name : String ,
24+ name : InternedString ,
2425 version : Option < Version > ,
2526 url : Option < Url > ,
2627}
@@ -66,7 +67,7 @@ impl PackageIdSpec {
6667 } ;
6768 validate_package_name ( name, "pkgid" , "" ) ?;
6869 Ok ( PackageIdSpec {
69- name : name . to_string ( ) ,
70+ name : InternedString :: new ( name ) ,
7071 version,
7172 url : None ,
7273 } )
@@ -86,7 +87,7 @@ impl PackageIdSpec {
8687 /// fields filled in.
8788 pub fn from_package_id ( package_id : PackageId ) -> PackageIdSpec {
8889 PackageIdSpec {
89- name : package_id. name ( ) . to_string ( ) ,
90+ name : package_id. name ( ) ,
9091 version : Some ( package_id. version ( ) . clone ( ) ) ,
9192 url : Some ( package_id. source_id ( ) . url ( ) . clone ( ) ) ,
9293 }
@@ -117,19 +118,19 @@ impl PackageIdSpec {
117118 match parts. next ( ) {
118119 Some ( part) => {
119120 let version = part. to_semver ( ) ?;
120- ( name_or_version . to_string ( ) , Some ( version) )
121+ ( InternedString :: new ( name_or_version ) , Some ( version) )
121122 }
122123 None => {
123124 if name_or_version. chars ( ) . next ( ) . unwrap ( ) . is_alphabetic ( ) {
124- ( name_or_version . to_string ( ) , None )
125+ ( InternedString :: new ( name_or_version ) , None )
125126 } else {
126127 let version = name_or_version. to_semver ( ) ?;
127- ( path_name . to_string ( ) , Some ( version) )
128+ ( InternedString :: new ( path_name ) , Some ( version) )
128129 }
129130 }
130131 }
131132 }
132- None => ( path_name . to_string ( ) , None ) ,
133+ None => ( InternedString :: new ( path_name ) , None ) ,
133134 }
134135 } ;
135136 Ok ( PackageIdSpec {
@@ -139,8 +140,8 @@ impl PackageIdSpec {
139140 } )
140141 }
141142
142- pub fn name ( & self ) -> & str {
143- & self . name
143+ pub fn name ( & self ) -> InternedString {
144+ self . name
144145 }
145146
146147 pub fn version ( & self ) -> Option < & Version > {
@@ -157,7 +158,7 @@ impl PackageIdSpec {
157158
158159 /// Checks whether the given `PackageId` matches the `PackageIdSpec`.
159160 pub fn matches ( & self , package_id : PackageId ) -> bool {
160- if self . name ( ) != & * package_id. name ( ) {
161+ if self . name ( ) != package_id. name ( ) {
161162 return false ;
162163 }
163164
@@ -234,7 +235,7 @@ impl fmt::Display for PackageIdSpec {
234235 } else {
235236 write ! ( f, "{}" , url) ?;
236237 }
237- if url. path_segments ( ) . unwrap ( ) . next_back ( ) . unwrap ( ) != self . name {
238+ if url. path_segments ( ) . unwrap ( ) . next_back ( ) . unwrap ( ) != & * self . name {
238239 printed_name = true ;
239240 write ! ( f, "#{}" , self . name) ?;
240241 }
@@ -273,6 +274,7 @@ impl<'de> de::Deserialize<'de> for PackageIdSpec {
273274#[ cfg( test) ]
274275mod tests {
275276 use super :: PackageIdSpec ;
277+ use crate :: core:: interning:: InternedString ;
276278 use crate :: core:: { PackageId , SourceId } ;
277279 use crate :: util:: ToSemver ;
278280 use url:: Url ;
@@ -288,63 +290,63 @@ mod tests {
288290 ok (
289291 "https://crates.io/foo#1.2.3" ,
290292 PackageIdSpec {
291- name : "foo" . to_string ( ) ,
293+ name : InternedString :: new ( "foo" ) ,
292294 version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
293295 url : Some ( Url :: parse ( "https://crates.io/foo" ) . unwrap ( ) ) ,
294296 } ,
295297 ) ;
296298 ok (
297299 "https://crates.io/foo#bar:1.2.3" ,
298300 PackageIdSpec {
299- name : "bar" . to_string ( ) ,
301+ name : InternedString :: new ( "bar" ) ,
300302 version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
301303 url : Some ( Url :: parse ( "https://crates.io/foo" ) . unwrap ( ) ) ,
302304 } ,
303305 ) ;
304306 ok (
305307 "crates.io/foo" ,
306308 PackageIdSpec {
307- name : "foo" . to_string ( ) ,
309+ name : InternedString :: new ( "foo" ) ,
308310 version : None ,
309311 url : Some ( Url :: parse ( "cargo://crates.io/foo" ) . unwrap ( ) ) ,
310312 } ,
311313 ) ;
312314 ok (
313315 "crates.io/foo#1.2.3" ,
314316 PackageIdSpec {
315- name : "foo" . to_string ( ) ,
317+ name : InternedString :: new ( "foo" ) ,
316318 version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
317319 url : Some ( Url :: parse ( "cargo://crates.io/foo" ) . unwrap ( ) ) ,
318320 } ,
319321 ) ;
320322 ok (
321323 "crates.io/foo#bar" ,
322324 PackageIdSpec {
323- name : "bar" . to_string ( ) ,
325+ name : InternedString :: new ( "bar" ) ,
324326 version : None ,
325327 url : Some ( Url :: parse ( "cargo://crates.io/foo" ) . unwrap ( ) ) ,
326328 } ,
327329 ) ;
328330 ok (
329331 "crates.io/foo#bar:1.2.3" ,
330332 PackageIdSpec {
331- name : "bar" . to_string ( ) ,
333+ name : InternedString :: new ( "bar" ) ,
332334 version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
333335 url : Some ( Url :: parse ( "cargo://crates.io/foo" ) . unwrap ( ) ) ,
334336 } ,
335337 ) ;
336338 ok (
337339 "foo" ,
338340 PackageIdSpec {
339- name : "foo" . to_string ( ) ,
341+ name : InternedString :: new ( "foo" ) ,
340342 version : None ,
341343 url : None ,
342344 } ,
343345 ) ;
344346 ok (
345347 "foo:1.2.3" ,
346348 PackageIdSpec {
347- name : "foo" . to_string ( ) ,
349+ name : InternedString :: new ( "foo" ) ,
348350 version : Some ( "1.2.3" . to_semver ( ) . unwrap ( ) ) ,
349351 url : None ,
350352 } ,
0 commit comments