From 7d5494dddd98868fb28ab07107e346981c532834 Mon Sep 17 00:00:00 2001 From: Pietro Albini Date: Thu, 4 Jul 2019 15:56:20 +0200 Subject: prevent subteams of subteams at the validation level --- src/validate.rs | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/validate.rs b/src/validate.rs index 478515a..87f2354 100644 --- a/src/validate.rs +++ b/src/validate.rs @@ -1,8 +1,8 @@ use crate::data::Data; use crate::schema::{Email, Permissions}; -use failure::{bail, ensure, Error}; +use failure::{bail, Error}; use regex::Regex; -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; static CHECKS: &[fn(&Data, &mut Vec)] = &[ validate_wg_names, @@ -64,14 +64,25 @@ fn validate_wg_names(data: &Data, errors: &mut Vec) { /// Ensure `subteam-of` points to an existing team fn validate_subteam_of(data: &Data, errors: &mut Vec) { - let team_names: HashSet<_> = data.teams().map(|t| t.name()).collect(); + let teams: HashMap<_, _> = data + .teams() + .map(|t| (t.name(), t.subteam_of().is_some())) + .collect(); wrapper(data.teams(), errors, |team, _| { if let Some(subteam_of) = team.subteam_of() { - ensure!( - team_names.contains(subteam_of), - "team `{}` doesn't exist", - subteam_of - ); + match teams.get(subteam_of) { + Some(false) => {} + Some(true) => bail!( + "team `{}` can't be a subteam of a subteam (`{}`)", + team.name(), + subteam_of + ), + None => bail!( + "the parent of team `{}` doesn't exist: `{}`", + team.name(), + subteam_of + ), + } } Ok(()) }); -- cgit v1.2.3