@@ -950,17 +950,10 @@ impl serde::de::Error for FieldError {
950
950
}
951
951
}
952
952
953
- let suggestion = expected
954
- . iter ( )
955
- . filter_map ( |expected| {
956
- let dist = edit_distance ( field, expected, 4 ) ?;
957
- Some ( ( dist, expected) )
958
- } )
959
- . min_by_key ( |& ( dist, _) | dist)
960
- . map ( |( _, suggestion) | Suggestion {
961
- message : "perhaps you meant" ,
962
- suggestion,
963
- } ) ;
953
+ let suggestion = suggest_candidate ( field, expected) . map ( |suggestion| Suggestion {
954
+ message : "perhaps you meant" ,
955
+ suggestion,
956
+ } ) ;
964
957
965
958
Self { error : msg, suggestion }
966
959
}
@@ -998,6 +991,22 @@ fn calculate_dimensions(fields: &[&str]) -> (usize, Vec<usize>) {
998
991
( rows, column_widths)
999
992
}
1000
993
994
+ /// Given a user-provided value that couldn't be matched to a known option, finds the most likely
995
+ /// candidate among candidates that the user might have meant.
996
+ fn suggest_candidate < ' a , I > ( value : & str , candidates : I ) -> Option < & ' a str >
997
+ where
998
+ I : IntoIterator < Item = & ' a str > ,
999
+ {
1000
+ candidates
1001
+ . into_iter ( )
1002
+ . filter_map ( |expected| {
1003
+ let dist = edit_distance ( value, expected, 4 ) ?;
1004
+ Some ( ( dist, expected) )
1005
+ } )
1006
+ . min_by_key ( |& ( dist, _) | dist)
1007
+ . map ( |( _, suggestion) | suggestion)
1008
+ }
1009
+
1001
1010
#[ cfg( test) ]
1002
1011
mod tests {
1003
1012
use serde:: de:: IgnoredAny ;
0 commit comments