@@ -94,13 +94,8 @@ impl PackageIdSpec {
9494 . into ( ) ) ;
9595 }
9696 }
97- let mut parts = spec. splitn ( 2 , [ ':' , '@' ] ) ;
98- let name = parts. next ( ) . unwrap ( ) ;
99- let version = match parts. next ( ) {
100- Some ( version) => Some ( version. parse :: < PartialVersion > ( ) ?) ,
101- None => None ,
102- } ;
103- PackageName :: new ( name) ?;
97+ let ( name, version) = parse_spec ( spec) ?. unwrap_or_else ( || ( spec. to_owned ( ) , None ) ) ;
98+ PackageName :: new ( & name) ?;
10499 Ok ( PackageIdSpec {
105100 name : String :: from ( name) ,
106101 version,
@@ -161,11 +156,8 @@ impl PackageIdSpec {
161156 return Err ( ErrorKind :: MissingUrlPath ( url) . into ( ) ) ;
162157 } ;
163158 match frag {
164- Some ( fragment) => match fragment. split_once ( [ ':' , '@' ] ) {
165- Some ( ( name, part) ) => {
166- let version = part. parse :: < PartialVersion > ( ) ?;
167- ( String :: from ( name) , Some ( version) )
168- }
159+ Some ( fragment) => match parse_spec ( & fragment) ? {
160+ Some ( ( name, ver) ) => ( name, ver) ,
169161 None => {
170162 if fragment. chars ( ) . next ( ) . unwrap ( ) . is_alphabetic ( ) {
171163 ( String :: from ( fragment. as_str ( ) ) , None )
@@ -217,6 +209,15 @@ impl PackageIdSpec {
217209 }
218210}
219211
212+ fn parse_spec ( spec : & str ) -> Result < Option < ( String , Option < PartialVersion > ) > > {
213+ let Some ( ( name, ver) ) = spec. split_once ( [ ':' , '@' ] ) else {
214+ return Ok ( None ) ;
215+ } ;
216+ let name = name. to_owned ( ) ;
217+ let ver = ver. parse :: < PartialVersion > ( ) ?;
218+ Ok ( Some ( ( name, Some ( ver) ) ) )
219+ }
220+
220221fn strip_url_protocol ( url : & Url ) -> Url {
221222 // Ridiculous hoop because `Url::set_scheme` errors when changing to http/https
222223 let raw = url. to_string ( ) ;
0 commit comments