summaryrefslogtreecommitdiffstats
path: root/src/schema.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/schema.rs')
-rw-r--r--src/schema.rs98
1 files changed, 97 insertions, 1 deletions
diff --git a/src/schema.rs b/src/schema.rs
index bab5809..5e08a26 100644
--- a/src/schema.rs
+++ b/src/schema.rs
@@ -1,5 +1,5 @@
use crate::data::Data;
-use failure::{Error, err_msg};
+use failure::{err_msg, Error};
use std::collections::HashSet;
#[derive(serde_derive::Deserialize, Debug)]
@@ -7,9 +7,11 @@ pub(crate) struct Person {
name: String,
github: String,
irc: Option<String>,
+ email: Option<String>,
}
impl Person {
+ #[allow(unused)]
pub(crate) fn name(&self) -> &str {
&self.name
}
@@ -18,6 +20,7 @@ impl Person {
&self.github
}
+ #[allow(unused)]
pub(crate) fn irc(&self) -> &str {
if let Some(irc) = &self.irc {
irc
@@ -25,6 +28,10 @@ impl Person {
&self.github
}
}
+
+ pub(crate) fn email(&self) -> Option<&str> {
+ self.email.as_ref().map(|e| e.as_str())
+ }
}
#[derive(serde_derive::Deserialize, Debug)]
@@ -33,6 +40,8 @@ pub(crate) struct Team {
#[serde(default)]
children: Vec<String>,
people: TeamPeople,
+ #[serde(default)]
+ lists: Vec<TeamList>,
}
impl Team {
@@ -56,6 +65,48 @@ impl Team {
}
Ok(members)
}
+
+ pub(crate) fn lists(&self, data: &Data) -> Result<Vec<List>, Error> {
+ let mut lists = Vec::new();
+ for raw_list in &self.lists {
+ let mut list = List {
+ address: raw_list.address.clone(),
+ access_level: raw_list.access_level,
+ emails: Vec::new(),
+ };
+
+ let mut members = if raw_list.include_team_members {
+ self.members(data)?
+ } else {
+ HashSet::new()
+ };
+ for person in &raw_list.extra_people {
+ members.insert(person.as_str());
+ }
+ for team in &raw_list.extra_teams {
+ let team = data
+ .team(team)
+ .ok_or_else(|| err_msg(format!("team {} is missing", team)))?;
+ for member in team.members(data)? {
+ members.insert(member);
+ }
+ }
+
+ for member in members.iter() {
+ let member = data
+ .person(member)
+ .ok_or_else(|| err_msg(format!("member {} is missing", member)))?;
+ if let Some(email) = member.email() {
+ list.emails.push(email.to_string());
+ }
+ }
+ for extra in &raw_list.extra_emails {
+ list.emails.push(extra.to_string());
+ }
+ lists.push(list);
+ }
+ Ok(lists)
+ }
}
#[derive(serde_derive::Deserialize, Debug)]
@@ -63,3 +114,48 @@ struct TeamPeople {
leads: Vec<String>,
members: Vec<String>,
}
+
+#[derive(serde_derive::Deserialize, Debug)]
+#[serde(rename_all = "kebab-case")]
+pub(crate) struct TeamList {
+ address: String,
+ access_level: ListAccessLevel,
+ #[serde(default = "default_true")]
+ include_team_members: bool,
+ #[serde(default)]
+ extra_people: Vec<String>,
+ #[serde(default)]
+ extra_emails: Vec<String>,
+ #[serde(default)]
+ extra_teams: Vec<String>,
+}
+
+#[derive(serde_derive::Deserialize, Debug, Copy, Clone)]
+#[serde(rename_all = "kebab-case")]
+pub(crate) enum ListAccessLevel {
+ Everyone,
+ Members,
+ #[serde(rename = "read-only")]
+ Readonly,
+}
+
+#[derive(Debug)]
+pub(crate) struct List {
+ address: String,
+ access_level: ListAccessLevel,
+ emails: Vec<String>,
+}
+
+impl List {
+ pub(crate) fn address(&self) -> &str {
+ &self.address
+ }
+
+ pub(crate) fn emails(&self) -> &[String] {
+ &self.emails
+ }
+}
+
+fn default_true() -> bool {
+ true
+}