diff options
author | Pietro Albini <pietro@pietroalbini.org> | 2018-11-25 18:43:11 +0100 |
---|---|---|
committer | Pietro Albini <pietro@pietroalbini.org> | 2018-11-25 18:43:11 +0100 |
commit | 17618b4912eb46f41154c515157bedd80b7caf3d (patch) | |
tree | 6e29b5bd83a7aa526b6301f142d6d08e6ff5ccfb /src/validate.rs | |
parent | 484ad8557dd22a5e221191997d55e731c93168a0 (diff) |
add basic team structure handling
Diffstat (limited to 'src/validate.rs')
-rw-r--r-- | src/validate.rs | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/validate.rs b/src/validate.rs new file mode 100644 index 0000000..61e0778 --- /dev/null +++ b/src/validate.rs @@ -0,0 +1,79 @@ +use crate::data::Data; +use std::collections::HashSet; +use failure::{Error, bail}; + +pub(crate) fn validate(data: &Data) -> Result<(), Error> { + let mut errors = Vec::new(); + + validate_team_leads(data, &mut errors); + validate_team_members(data, &mut errors); + validate_inactive_members(data, &mut errors); + + if !errors.is_empty() { + for err in &errors { + eprintln!("validation error: {}", err); + } + + bail!("{} validation errors found", errors.len()); + } + + Ok(()) +} + +/// Ensure team leaders are part of the teams they lead +fn validate_team_leads(data: &Data, errors: &mut Vec<String>) { + for team in data.teams() { + let members = match team.members(data) { + Ok(m) => m, + Err(err) => { + errors.push(err.to_string()); + continue; + } + }; + for lead in team.leads() { + if !members.contains(lead) { + errors.push(format!("`{}` leads team `{}`, but is not a member of it", lead, team.name())); + } + } + } +} + +/// Ensure team members are people +fn validate_team_members(data: &Data, errors: &mut Vec<String>) { + for team in data.teams() { + let members = match team.members(data) { + Ok(m) => m, + Err(err) => { + errors.push(err.to_string()); + continue; + } + }; + for member in members { + if data.person(member).is_none() { + errors.push(format!("person `{}` is member of team `{}` but doesn't exist", member, team.name())); + } + } + } +} + +/// Ensure every person is part of at least a team +fn validate_inactive_members(data: &Data, errors: &mut Vec<String>) { + let mut active_members = HashSet::new(); + for team in data.teams() { + let members = match team.members(data) { + Ok(m) => m, + Err(err) => { + errors.push(err.to_string()); + continue; + } + }; + for member in members { + active_members.insert(member); + } + } + + let all_members = data.people().map(|p| p.github()).collect::<HashSet<_>>(); + for person in all_members.difference(&active_members) { + errors.push(format!("person `{}` is not a member of any team", person)); + } +} |