diff options
Diffstat (limited to 'src/schema.rs')
-rw-r--r-- | src/schema.rs | 55 |
1 files changed, 48 insertions, 7 deletions
diff --git a/src/schema.rs b/src/schema.rs index 5e08a26..ac5b243 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -3,6 +3,7 @@ use failure::{err_msg, Error}; use std::collections::HashSet; #[derive(serde_derive::Deserialize, Debug)] +#[serde(deny_unknown_fields)] pub(crate) struct Person { name: String, github: String, @@ -35,11 +36,15 @@ impl Person { } #[derive(serde_derive::Deserialize, Debug)] +#[serde(deny_unknown_fields)] pub(crate) struct Team { name: String, + #[serde(default = "default_false")] + wg: bool, #[serde(default)] children: Vec<String>, people: TeamPeople, + website: Option<WebsiteData>, #[serde(default)] lists: Vec<TeamList>, } @@ -49,6 +54,10 @@ impl Team { &self.name } + pub(crate) fn is_wg(&self) -> bool { + self.wg + } + pub(crate) fn leads(&self) -> HashSet<&str> { self.people.leads.iter().map(|s| s.as_str()).collect() } @@ -63,9 +72,24 @@ impl Team { members.insert(person); } } + if self.people.include_team_leads || self.people.include_wg_leads { + for team in data.teams() { + let include_wg = team.is_wg() && self.people.include_wg_leads; + let include_team = !team.is_wg() && self.people.include_team_leads; + if include_wg || include_team { + for lead in team.leads() { + members.insert(lead); + } + } + } + } Ok(members) } + pub(crate) fn raw_lists(&self) -> &[TeamList] { + &self.lists + } + pub(crate) fn lists(&self, data: &Data) -> Result<Vec<List>, Error> { let mut lists = Vec::new(); for raw_list in &self.lists { @@ -110,24 +134,37 @@ impl Team { } #[derive(serde_derive::Deserialize, Debug)] +#[serde(rename_all = "kebab-case", deny_unknown_fields)] struct TeamPeople { leads: Vec<String>, members: Vec<String>, + #[serde(default = "default_false")] + include_team_leads: bool, + #[serde(default = "default_false")] + include_wg_leads: bool, } #[derive(serde_derive::Deserialize, Debug)] -#[serde(rename_all = "kebab-case")] +#[serde(deny_unknown_fields)] +pub(crate) struct WebsiteData { + name: String, + description: String, + email: Option<String>, +} + +#[derive(serde_derive::Deserialize, Debug)] +#[serde(rename_all = "kebab-case", deny_unknown_fields)] pub(crate) struct TeamList { - address: String, - access_level: ListAccessLevel, + pub(crate) address: String, + pub(crate) access_level: ListAccessLevel, #[serde(default = "default_true")] - include_team_members: bool, + pub(crate) include_team_members: bool, #[serde(default)] - extra_people: Vec<String>, + pub(crate) extra_people: Vec<String>, #[serde(default)] - extra_emails: Vec<String>, + pub(crate) extra_emails: Vec<String>, #[serde(default)] - extra_teams: Vec<String>, + pub(crate) extra_teams: Vec<String>, } #[derive(serde_derive::Deserialize, Debug, Copy, Clone)] @@ -159,3 +196,7 @@ impl List { fn default_true() -> bool { true } + +fn default_false() -> bool { + false +} |