@@ -251,14 +251,14 @@ pub(super) fn activation_error(
251251 // Maybe the user mistyped the name? Like `dep-thing` when `Dep_Thing`
252252 // was meant. So we try asking the registry for a `fuzzy` search for suggestions.
253253 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 ) {
255255 return to_resolve_err ( e) ;
256256 } ;
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 ( ) ) ;
259259 let mut candidates: Vec < _ > = candidates
260260 . iter ( )
261- . map ( |n| ( lev_distance ( & * new_dep. package_name ( ) , & * n) , n) )
261+ . map ( |n| ( lev_distance ( & * new_dep. package_name ( ) , & * n. name ( ) ) , n) )
262262 . filter ( |& ( d, _) | d < 4 )
263263 . collect ( ) ;
264264 candidates. sort_by_key ( |o| o. 0 ) ;
@@ -269,25 +269,38 @@ pub(super) fn activation_error(
269269 dep. source_id( )
270270 ) ;
271271 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+ ) ) ;
280302 }
281303
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- ) ) ;
291304 msg. push_str ( "\n " ) ;
292305 }
293306 msg. push_str ( "required by " ) ;
0 commit comments