@@ -35,6 +35,9 @@ extern crate pest_derive;
35
35
#[ macro_use]
36
36
extern crate serde_json;
37
37
38
+ use std:: collections:: HashMap ;
39
+ use tracing;
40
+
38
41
pub mod cache;
39
42
pub mod filter;
40
43
pub mod graphql;
@@ -299,20 +302,10 @@ pub fn normalize_path(path: &std::path::Path) -> std::path::PathBuf {
299
302
ret
300
303
}
301
304
302
- #[ derive( Debug , serde:: Deserialize ) ]
303
- struct Acl {
304
- pub repo : Vec < Repo > ,
305
- }
306
-
307
- #[ derive( Debug , serde:: Deserialize ) ]
308
- struct Repo {
309
- pub name : String ,
310
- pub user : Vec < User > ,
311
- }
305
+ type Acl = HashMap < String , HashMap < String , User > > ;
312
306
313
307
#[ derive( Debug , serde:: Deserialize ) ]
314
308
struct User {
315
- pub name : String ,
316
309
pub whitelist : Option < String > ,
317
310
pub blacklist : Option < String > ,
318
311
}
@@ -321,44 +314,30 @@ pub fn get_whitelist(acl: &str, user: &str, repo: &str) -> JoshResult<filter::Fi
321
314
let acl = std:: fs:: read_to_string ( acl) . map_err ( |_| josh_error ( "failed to read acl file" ) ) ?;
322
315
let acl: Acl = toml:: from_str ( & acl)
323
316
. map_err ( |err| josh_error ( format ! ( "failed to parse acl file: {}" , err) . as_str ( ) ) ) ?;
324
- for r in acl. repo {
325
- if r. name == repo {
326
- for u in r. user {
327
- if u. name == user {
328
- match u. whitelist {
329
- Some ( w) => {
330
- let filter = filter:: parse ( & w) ?;
331
- return Ok ( filter) ;
332
- }
333
- _ => return Ok ( filter:: empty ( ) ) ,
334
- }
335
- }
336
- }
337
- }
338
- }
339
-
340
- return Ok ( filter:: empty ( ) ) ;
317
+ return Ok ( match acl. get ( repo) {
318
+ Some ( r) => match r. get ( user) {
319
+ Some ( u) => match & u. whitelist {
320
+ Some ( w) => filter:: parse ( & w) ?,
321
+ _ => filter:: nop ( ) ,
322
+ } ,
323
+ _ => filter:: empty ( ) ,
324
+ } ,
325
+ _ => filter:: empty ( ) ,
326
+ } ) ;
341
327
}
342
328
343
329
pub fn get_blacklist ( acl : & str , user : & str , repo : & str ) -> JoshResult < filter:: Filter > {
344
330
let acl = std:: fs:: read_to_string ( acl) . map_err ( |_| josh_error ( "failed to read acl file" ) ) ?;
345
331
let acl: Acl = toml:: from_str ( & acl)
346
332
. map_err ( |err| josh_error ( format ! ( "failed to parse acl file: {}" , err) . as_str ( ) ) ) ?;
347
- for r in acl. repo {
348
- if r. name == repo {
349
- for u in r. user {
350
- if u. name == user {
351
- match u. blacklist {
352
- Some ( b) => {
353
- let filter = filter:: parse ( & b) ?;
354
- return Ok ( filter) ;
355
- }
356
- _ => return Ok ( filter:: nop ( ) ) ,
357
- }
358
- }
359
- }
360
- }
361
- }
362
-
363
- return Ok ( filter:: nop ( ) ) ;
333
+ return Ok ( match acl. get ( repo) {
334
+ Some ( r) => match r. get ( user) {
335
+ Some ( u) => match & u. blacklist {
336
+ Some ( b) => filter:: parse ( & b) ?,
337
+ _ => filter:: empty ( ) ,
338
+ } ,
339
+ _ => filter:: nop ( ) ,
340
+ } ,
341
+ _ => filter:: nop ( ) ,
342
+ } ) ;
364
343
}
0 commit comments