@@ -251,14 +251,14 @@ pub(super) fn activation_error(
251
251
// Maybe the user mistyped the name? Like `dep-thing` when `Dep_Thing`
252
252
// was meant. So we try asking the registry for a `fuzzy` search for suggestions.
253
253
let mut candidates = Vec :: new ( ) ;
254
- if let Err ( e) = registry. query ( & new_dep, & mut |s| candidates. push ( s. name ( ) ) , true ) {
254
+ if let Err ( e) = registry. query ( & new_dep, & mut |s| candidates. push ( s. clone ( ) ) , true ) {
255
255
return to_resolve_err ( e) ;
256
256
} ;
257
- candidates. sort_unstable ( ) ;
258
- candidates. dedup ( ) ;
257
+ candidates. sort_unstable_by ( |a , b| a . name ( ) . cmp ( & b . name ( ) ) ) ;
258
+ candidates. dedup_by ( |a , b| a . name ( ) == b . name ( ) ) ;
259
259
let mut candidates: Vec < _ > = candidates
260
260
. iter ( )
261
- . map ( |n| ( lev_distance ( & * new_dep. package_name ( ) , & * n) , n) )
261
+ . map ( |n| ( lev_distance ( & * new_dep. package_name ( ) , & * n. name ( ) ) , n) )
262
262
. filter ( |& ( d, _) | d < 4 )
263
263
. collect ( ) ;
264
264
candidates. sort_by_key ( |o| o. 0 ) ;
@@ -269,25 +269,38 @@ pub(super) fn activation_error(
269
269
dep. source_id( )
270
270
) ;
271
271
if !candidates. is_empty ( ) {
272
- let mut names = candidates
273
- . iter ( )
274
- . take ( 3 )
275
- . map ( |c| c. 1 . as_str ( ) )
276
- . collect :: < Vec < _ > > ( ) ;
277
-
278
- if candidates. len ( ) > 3 {
279
- names. push ( "..." ) ;
272
+ // If dependency package name is equal to the name of the candidate here
273
+ // it may be a prerelease package which hasn't been speficied correctly
274
+ if dep. package_name ( ) == candidates[ 0 ] . 1 . name ( ) &&
275
+ candidates[ 0 ] . 1 . package_id ( ) . version ( ) . is_prerelease ( ) {
276
+ msg. push_str ( "prerelease package needs to be specified explicitly\n " ) ;
277
+ msg. push_str ( & format ! (
278
+ "{name} = {{ version = \" {version}\" }}" ,
279
+ name = candidates[ 0 ] . 1 . name( ) ,
280
+ version = candidates[ 0 ] . 1 . package_id( ) . version( )
281
+ ) ) ;
282
+ } else {
283
+ let mut names = candidates
284
+ . iter ( )
285
+ . take ( 3 )
286
+ . map ( |c| c. 1 . name ( ) . as_str ( ) )
287
+ . collect :: < Vec < _ > > ( ) ;
288
+
289
+ if candidates. len ( ) > 3 {
290
+ names. push ( "..." ) ;
291
+ }
292
+
293
+ msg. push_str ( "perhaps you meant: " ) ;
294
+ msg. push_str ( & names. iter ( ) . enumerate ( ) . fold (
295
+ String :: default ( ) ,
296
+ |acc, ( i, el) | match i {
297
+ 0 => acc + el,
298
+ i if names. len ( ) - 1 == i && candidates. len ( ) <= 3 => acc + " or " + el,
299
+ _ => acc + ", " + el,
300
+ } ,
301
+ ) ) ;
280
302
}
281
303
282
- msg. push_str ( "perhaps you meant: " ) ;
283
- msg. push_str ( & names. iter ( ) . enumerate ( ) . fold (
284
- String :: default ( ) ,
285
- |acc, ( i, el) | match i {
286
- 0 => acc + el,
287
- i if names. len ( ) - 1 == i && candidates. len ( ) <= 3 => acc + " or " + el,
288
- _ => acc + ", " + el,
289
- } ,
290
- ) ) ;
291
304
msg. push_str ( "\n " ) ;
292
305
}
293
306
msg. push_str ( "required by " ) ;
0 commit comments