diff --git a/parser/src/command.rs b/parser/src/command.rs index 30f46a119..829f41332 100644 --- a/parser/src/command.rs +++ b/parser/src/command.rs @@ -519,3 +519,22 @@ fn delegate_with_at() { }))) ); } + +#[test] +fn test_follow_commands() { + let input = "@bot claim @bot label +bug"; + let mut input = Input::new(input, vec!["bot"]); + assert_eq!( + input.next(), + Some(Command::Assign(Ok(assign::AssignCommand::AssignUser { + username: "bot".to_string() + }))) + ); + assert_eq!( + input.next(), + Some(Command::Relabel(Ok(relabel::RelabelCommand(vec![ + relabel::LabelDelta::Add(relabel::Label("bug".into())) + ])))) + ); + assert_eq!(input.next(), None); +} diff --git a/parser/src/command/assign.rs b/parser/src/command/assign.rs index d6807582c..2c88b89b8 100644 --- a/parser/src/command/assign.rs +++ b/parser/src/command/assign.rs @@ -5,7 +5,8 @@ //! The grammar is as follows: //! //! ```text -//! Command: `@bot claim`, `@bot release-assignment`, or `@bot assign @user`. +//! Command: `@bot claim`, `@bot release-assignment`, `@bot assign @user`, or +//! `@bot claim @user` //! ``` use crate::error::Error; @@ -18,7 +19,7 @@ pub enum AssignCommand { Claim, /// Corresponds to `@bot release-assignment` or `@bot unclaim`. ReleaseAssignment, - /// Corresponds to `@bot assign @user`. + /// Corresponds to `@bot assign @user` or `@bot claim @user`. AssignUser { username: String }, /// Corresponds to `r? [@]user`. RequestReview { name: String }, @@ -55,6 +56,14 @@ impl AssignCommand { let mut toks = input.clone(); if let Some(Token::Word("claim")) = toks.peek_token()? { toks.next_token()?; + if let Some(Token::Word(user)) = toks.peek_token()? + && user.starts_with('@') + && user.len() != 1 + { + return Ok(Some(AssignCommand::AssignUser { + username: user[1..].to_owned(), + })); + } if let Some(Token::Dot | Token::EndOfLine) = toks.peek_token()? { toks.next_token()?; } @@ -154,6 +163,34 @@ mod tests { ); } + #[test] + fn test_5() { + assert_eq!( + parse("claim @user"), + Ok(Some(AssignCommand::AssignUser { + username: "user".to_string() + })), + ); + } + + #[test] + fn test_6() { + assert_eq!( + parse("claim does not start with @"), + Ok(Some(AssignCommand::Claim)), + ); + } + + #[test] + fn test_7() { + assert_eq!( + parse("claim @triagebot"), + Ok(Some(AssignCommand::AssignUser { + username: "triagebot".to_string() + })), + ); + } + fn parse_review<'a>(input: &'a str) -> Result, Error<'a>> { let mut toks = Tokenizer::new(input); Ok(AssignCommand::parse_review(&mut toks)?)