@@ -24,6 +24,7 @@ static CHECKS: &[fn(&Data, &mut Vec<String>)] = &[
2424 validate_team_names,
2525 validate_github_teams,
2626 validate_marker_team,
27+ validate_discord_permissions,
2728] ;
2829
2930static GITHUB_CHECKS : & [ fn ( & Data , & GitHubApi , & mut Vec < String > ) ] = & [ validate_github_usernames] ;
@@ -435,6 +436,46 @@ fn validate_marker_team(data: &Data, errors: &mut Vec<String>) {
435436 } ) ;
436437}
437438
439+ /// Ensure all users with a Discord permission have a Discord ID.
440+ fn validate_discord_permissions ( data : & Data , errors : & mut Vec < String > ) {
441+ wrapper (
442+ Permissions :: REQUIRES_DISCORD . iter ( ) ,
443+ errors,
444+ |permission, errors| {
445+ wrapper ( data. people ( ) , errors, |person, _| {
446+ if person. permissions ( ) . has ( permission) && person. discord_id ( ) . is_none ( ) {
447+ bail ! (
448+ "person `{}` has a Discord permission (`{}`) but no Discord ID" ,
449+ person. github( ) ,
450+ permission
451+ ) ;
452+ }
453+ Ok ( ( ) )
454+ } ) ;
455+ wrapper ( data. teams ( ) , errors, |team, errors| {
456+ if !team. permissions ( ) . has ( permission) {
457+ return Ok ( ( ) ) ;
458+ }
459+ wrapper ( team. members ( data) ?. iter ( ) , errors, |member, _| {
460+ let person = data
461+ . person ( member)
462+ . ok_or_else ( || failure:: format_err!( "missing person {}" , member) ) ?;
463+ if person. discord_id ( ) . is_none ( ) {
464+ bail ! (
465+ "person `{}` has a Discord permission (`{}`) but no Discord ID" ,
466+ person. github( ) ,
467+ permission
468+ ) ;
469+ }
470+ Ok ( ( ) )
471+ } ) ;
472+ Ok ( ( ) )
473+ } ) ;
474+ Ok ( ( ) )
475+ } ,
476+ ) ;
477+ }
478+
438479fn wrapper < T , I , F > ( iter : I , errors : & mut Vec < String > , mut func : F )
439480where
440481 I : Iterator < Item = T > ,
0 commit comments