@@ -59,6 +59,7 @@ pub struct RuleMatchResult {
59
59
pub struct Rule {
60
60
pub channel : String ,
61
61
pub query : Query ,
62
+ pub exclude_query : Option < Query > ,
62
63
pub display_name : String ,
63
64
}
64
65
@@ -241,8 +242,17 @@ async fn webhook(
241
242
242
243
impl Rule {
243
244
fn check_match ( & self , payload : & github:: Payload ) -> bool {
244
- let query = & self . query ;
245
+ let include_query_result = Rule :: match_results ( & self . query , payload ) . iter ( ) . all ( | & r| r ) ;
245
246
247
+ if let Some ( exclude_query) = & self . exclude_query {
248
+ let exclude_query_result = Rule :: match_results ( exclude_query, payload) . iter ( ) . any ( |& r| r) ;
249
+ include_query_result && !exclude_query_result
250
+ } else {
251
+ include_query_result
252
+ }
253
+ }
254
+
255
+ fn match_results ( query : & Query , payload : & github:: Payload ) -> Vec < bool > {
246
256
let r_repo = Rule :: match_query ( query. repo . as_ref ( ) , & payload. repo ( ) . full_name ) ;
247
257
248
258
let topics = & payload. repo ( ) . topics ;
@@ -257,11 +267,9 @@ impl Rule {
257
267
let r_labels = Rule :: match_query_vec ( query. label . as_ref ( ) , labels) ;
258
268
259
269
vec ! [ r_repo, r_topic, r_sender, r_title, r_body, r_labels]
260
- . iter ( )
270
+ . into_iter ( )
261
271
. flatten ( )
262
- . collect :: < Vec < & bool > > ( )
263
- . iter ( )
264
- . all ( |x| * * x)
272
+ . collect ( )
265
273
}
266
274
267
275
fn match_query ( query : Option < & String > , payload : & str ) -> Option < bool > {
0 commit comments