@@ -94,13 +94,8 @@ impl PackageIdSpec {
94
94
. into ( ) ) ;
95
95
}
96
96
}
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) ?;
104
99
Ok ( PackageIdSpec {
105
100
name : String :: from ( name) ,
106
101
version,
@@ -161,11 +156,8 @@ impl PackageIdSpec {
161
156
return Err ( ErrorKind :: MissingUrlPath ( url) . into ( ) ) ;
162
157
} ;
163
158
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) ,
169
161
None => {
170
162
if fragment. chars ( ) . next ( ) . unwrap ( ) . is_alphabetic ( ) {
171
163
( String :: from ( fragment. as_str ( ) ) , None )
@@ -217,6 +209,15 @@ impl PackageIdSpec {
217
209
}
218
210
}
219
211
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
+
220
221
fn strip_url_protocol ( url : & Url ) -> Url {
221
222
// Ridiculous hoop because `Url::set_scheme` errors when changing to http/https
222
223
let raw = url. to_string ( ) ;
0 commit comments