@@ -33,21 +33,28 @@ impl Handler for AssignmentHandler {
3333 type Config = AssignConfig ;
3434
3535 fn parse_input ( & self , ctx : & Context , event : & Event ) -> Result < Option < Self :: Input > , Error > {
36- #[ allow( irrefutable_let_patterns) ]
37- let event = if let Event :: IssueComment ( e) = event {
38- e
36+ let body = if let Some ( b) = event. comment_body ( ) {
37+ b
3938 } else {
4039 // not interested in other events
4140 return Ok ( None ) ;
4241 } ;
4342
44- let mut input = Input :: new ( & event. comment . body , & ctx. username ) ;
43+ if let Event :: Issue ( e) = event {
44+ if e. action != github:: IssuesAction :: Opened {
45+ // skip events other than opening the issue to avoid retriggering commands in the
46+ // issue body
47+ return Ok ( None ) ;
48+ }
49+ }
50+
51+ let mut input = Input :: new ( & body, & ctx. username ) ;
4552 match input. parse_command ( ) {
4653 Command :: Assign ( Ok ( command) ) => Ok ( Some ( command) ) ,
4754 Command :: Assign ( Err ( err) ) => {
4855 failure:: bail!(
4956 "Parsing assign command in [comment]({}) failed: {}" ,
50- event. comment . html_url,
57+ event. html_url( ) . expect ( "has html url" ) ,
5158 err
5259 ) ;
5360 }
@@ -62,27 +69,18 @@ impl Handler for AssignmentHandler {
6269 event : & Event ,
6370 cmd : AssignCommand ,
6471 ) -> Result < ( ) , Error > {
65- #[ allow( irrefutable_let_patterns) ]
66- let event = if let Event :: IssueComment ( e) = event {
67- e
72+ let is_team_member = if let Err ( _) | Ok ( false ) = event. user ( ) . is_team_member ( & ctx. github ) {
73+ false
6874 } else {
69- // not interested in other events
70- return Ok ( ( ) ) ;
75+ true
7176 } ;
7277
73- let is_team_member =
74- if let Err ( _) | Ok ( false ) = event. comment . user . is_team_member ( & ctx. github ) {
75- false
76- } else {
77- true
78- } ;
79-
80- let e = EditIssueBody :: new ( & event. issue , "ASSIGN" ) ;
78+ let e = EditIssueBody :: new ( & event. issue ( ) . unwrap ( ) , "ASSIGN" ) ;
8179
8280 let to_assign = match cmd {
83- AssignCommand :: Own => event. comment . user . login . clone ( ) ,
81+ AssignCommand :: Own => event. user ( ) . login . clone ( ) ,
8482 AssignCommand :: User { username } => {
85- if !is_team_member && username != event. comment . user . login {
83+ if !is_team_member && username != event. user ( ) . login {
8684 failure:: bail!( "Only Rust team members can assign other users" ) ;
8785 }
8886 username. clone ( )
@@ -92,18 +90,22 @@ impl Handler for AssignmentHandler {
9290 user : Some ( current) ,
9391 } ) = e. current_data ( )
9492 {
95- if current == event. comment . user . login || is_team_member {
96- event. issue . remove_assignees ( & ctx. github , Selection :: All ) ?;
93+ if current == event. user ( ) . login || is_team_member {
94+ event
95+ . issue ( )
96+ . unwrap ( )
97+ . remove_assignees ( & ctx. github , Selection :: All ) ?;
9798 e. apply ( & ctx. github , String :: new ( ) , AssignData { user : None } ) ?;
9899 return Ok ( ( ) ) ;
99100 } else {
100101 failure:: bail!( "Cannot release another user's assignment" ) ;
101102 }
102103 } else {
103- let current = & event. comment . user ;
104- if event. issue . contain_assignee ( current) {
104+ let current = & event. user ( ) ;
105+ if event. issue ( ) . unwrap ( ) . contain_assignee ( current) {
105106 event
106- . issue
107+ . issue ( )
108+ . unwrap ( )
107109 . remove_assignees ( & ctx. github , Selection :: One ( & current) ) ?;
108110 e. apply ( & ctx. github , String :: new ( ) , AssignData { user : None } ) ?;
109111 return Ok ( ( ) ) ;
@@ -119,18 +121,20 @@ impl Handler for AssignmentHandler {
119121
120122 e. apply ( & ctx. github , String :: new ( ) , & data) ?;
121123
122- match event. issue . set_assignee ( & ctx. github , & to_assign) {
124+ match event. issue ( ) . unwrap ( ) . set_assignee ( & ctx. github , & to_assign) {
123125 Ok ( ( ) ) => return Ok ( ( ) ) , // we are done
124126 Err ( github:: AssignmentError :: InvalidAssignee ) => {
125127 event
126- . issue
128+ . issue ( )
129+ . unwrap ( )
127130 . set_assignee ( & ctx. github , & ctx. username )
128131 . context ( "self-assignment failed" ) ?;
129132 e. apply (
130133 & ctx. github ,
131134 format ! (
132135 "This issue has been assigned to @{} via [this comment]({})." ,
133- to_assign, event. comment. html_url
136+ to_assign,
137+ event. html_url( ) . unwrap( )
134138 ) ,
135139 & data,
136140 ) ?;
0 commit comments