@@ -14,7 +14,7 @@ pub enum CommandParseError {
1414 MissingCommand ,
1515 UnknownCommand ( String ) ,
1616 MissingArgValue { arg : String } ,
17- UnknownArg ( String ) ,
17+ UnknownArg { arg : String , did_you_mean : String } ,
1818 DuplicateArg ( String ) ,
1919 ValidationError ( String ) ,
2020}
@@ -270,7 +270,10 @@ fn parser_try(command: &CommandPart<'_>, parts: &[CommandPart<'_>]) -> ParseResu
270270 for part in parts {
271271 match part {
272272 CommandPart :: Bare ( key) => {
273- return Some ( Err ( CommandParseError :: UnknownArg ( key. to_string ( ) ) ) ) ;
273+ return Some ( Err ( CommandParseError :: UnknownArg {
274+ arg : key. to_string ( ) ,
275+ did_you_mean : "jobs=<jobs>|parent=<parent>" . to_string ( ) ,
276+ } ) ) ;
274277 }
275278 CommandPart :: KeyValue { key, value } => match ( * key, * value) {
276279 ( "parent" , "last" ) => parent = Some ( Parent :: Last ) ,
@@ -299,7 +302,10 @@ fn parser_try(command: &CommandPart<'_>, parts: &[CommandPart<'_>]) -> ParseResu
299302 jobs = raw_jobs;
300303 }
301304 _ => {
302- return Some ( Err ( CommandParseError :: UnknownArg ( key. to_string ( ) ) ) ) ;
305+ return Some ( Err ( CommandParseError :: UnknownArg {
306+ arg : key. to_string ( ) ,
307+ did_you_mean : "jobs=<jobs>|parent=<parent>" . to_string ( ) ,
308+ } ) ) ;
303309 }
304310 } ,
305311 }
@@ -318,11 +324,24 @@ fn parser_try_cancel(command: &CommandPart<'_>, parts: &[CommandPart<'_>]) -> Pa
318324}
319325
320326/// Parses `@bors delegate=<try|review>` or `@bors delegate+`.
321- fn parser_delegate ( command : & CommandPart < ' _ > , _parts : & [ CommandPart < ' _ > ] ) -> ParseResult {
327+ fn parser_delegate ( command : & CommandPart < ' _ > , parts : & [ CommandPart < ' _ > ] ) -> ParseResult {
322328 match command {
323329 CommandPart :: Bare ( "delegate+" ) => {
324330 Some ( Ok ( BorsCommand :: SetDelegate ( DelegatedPermission :: Review ) ) )
325331 }
332+ CommandPart :: Bare ( "delegate" ) => {
333+ if !parts. is_empty ( ) {
334+ Some ( Err ( CommandParseError :: UnknownArg {
335+ arg : match parts[ 0 ] {
336+ CommandPart :: Bare ( arg) => arg. to_owned ( ) ,
337+ CommandPart :: KeyValue { key, .. } => key. to_owned ( ) ,
338+ } ,
339+ did_you_mean : "delegate=<try|review>" . to_string ( ) ,
340+ } ) )
341+ } else {
342+ Some ( Ok ( BorsCommand :: SetDelegate ( DelegatedPermission :: Review ) ) )
343+ }
344+ }
326345 CommandPart :: KeyValue {
327346 key : "delegate" ,
328347 value,
@@ -1163,15 +1182,31 @@ for the crater",
11631182 #[ test]
11641183 fn parse_try_unknown_arg ( ) {
11651184 let cmds = parse_commands ( "@bors try a" ) ;
1166- assert_eq ! ( cmds. len( ) , 1 ) ;
1167- assert_eq ! ( cmds[ 0 ] , Err ( CommandParseError :: UnknownArg ( "a" . to_string( ) ) ) ) ;
1185+ insta:: assert_debug_snapshot!( cmds, @r#"
1186+ [
1187+ Err(
1188+ UnknownArg {
1189+ arg: "a",
1190+ did_you_mean: "jobs=<jobs>|parent=<parent>",
1191+ },
1192+ ),
1193+ ]
1194+ "# ) ;
11681195 }
11691196
11701197 #[ test]
11711198 fn parse_try_unknown_kv_arg ( ) {
11721199 let cmds = parse_commands ( "@bors try a=b" ) ;
1173- assert_eq ! ( cmds. len( ) , 1 ) ;
1174- assert_eq ! ( cmds[ 0 ] , Err ( CommandParseError :: UnknownArg ( "a" . to_string( ) ) ) ) ;
1200+ insta:: assert_debug_snapshot!( cmds, @r#"
1201+ [
1202+ Err(
1203+ UnknownArg {
1204+ arg: "a",
1205+ did_you_mean: "jobs=<jobs>|parent=<parent>",
1206+ },
1207+ ),
1208+ ]
1209+ "# ) ;
11751210 }
11761211
11771212 #[ test]
@@ -1228,7 +1263,7 @@ for the crater",
12281263 }
12291264
12301265 #[ test]
1231- fn parse_delegate_author ( ) {
1266+ fn parse_delegate_plus_author ( ) {
12321267 let cmds = parse_commands ( "@bors delegate+" ) ;
12331268 assert_eq ! ( cmds. len( ) , 1 ) ;
12341269 assert ! ( matches!(
@@ -1237,6 +1272,31 @@ for the crater",
12371272 ) ) ;
12381273 }
12391274
1275+ #[ test]
1276+ fn parse_delegate_author ( ) {
1277+ let cmds = parse_commands ( "@bors delegate" ) ;
1278+ assert_eq ! ( cmds. len( ) , 1 ) ;
1279+ assert ! ( matches!(
1280+ cmds[ 0 ] ,
1281+ Ok ( BorsCommand :: SetDelegate ( DelegatedPermission :: Review ) )
1282+ ) ) ;
1283+ }
1284+
1285+ #[ test]
1286+ fn parse_delegate_unknown_arg ( ) {
1287+ let cmds = parse_commands ( "@bors delegate try" ) ;
1288+ insta:: assert_debug_snapshot!( cmds, @r#"
1289+ [
1290+ Err(
1291+ UnknownArg {
1292+ arg: "try",
1293+ did_you_mean: "delegate=<try|review>",
1294+ },
1295+ ),
1296+ ]
1297+ "# ) ;
1298+ }
1299+
12401300 #[ test]
12411301 fn parse_delegate_review_author ( ) {
12421302 let cmds = parse_commands ( "@bors delegate=review" ) ;
0 commit comments