diff options
author | Pietro Albini <pietro@pietroalbini.org> | 2019-03-30 11:36:31 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-03-30 11:36:31 +0100 |
commit | 6aa6d5abcd02ce5cd36606bc458372e7c65a0f8b (patch) | |
tree | 135195fcead2412a93b1d2951675d89083ecaefa /src | |
parent | a52b45a0a7e3d11132ab701b983a4aad2c4fb065 (diff) | |
parent | b9db45fe621b57829556d35b132549a271dfe253 (diff) |
Merge pull request #50 from rust-lang/rfcbot
Add rfcbot data to the Team API
Diffstat (limited to 'src')
-rw-r--r-- | src/schema.rs | 13 | ||||
-rw-r--r-- | src/static_api.rs | 28 | ||||
-rw-r--r-- | src/validate.rs | 14 |
3 files changed, 55 insertions, 0 deletions
diff --git a/src/schema.rs b/src/schema.rs index 0143301..be6b7a1 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -103,6 +103,7 @@ pub(crate) struct Team { people: TeamPeople, #[serde(default)] permissions: Permissions, + rfcbot: Option<RfcbotData>, website: Option<WebsiteData>, #[serde(default)] lists: Vec<TeamList>, @@ -125,6 +126,10 @@ impl Team { self.people.leads.iter().map(|s| s.as_str()).collect() } + pub(crate) fn rfcbot_data(&self) -> Option<&RfcbotData> { + self.rfcbot.as_ref() + } + pub(crate) fn website_data(&self) -> Option<&WebsiteData> { self.website.as_ref() } @@ -218,6 +223,14 @@ struct TeamPeople { include_all_team_members: bool, } +#[derive(serde_derive::Deserialize, Debug)] +#[serde(rename_all = "kebab-case", deny_unknown_fields)] +pub(crate) struct RfcbotData { + pub(crate) label: String, + pub(crate) name: String, + pub(crate) ping: String, +} + pub(crate) struct DiscordInvite<'a> { pub(crate) url: &'a str, pub(crate) channel: &'a str, diff --git a/src/static_api.rs b/src/static_api.rs index 24bd989..3348d74 100644 --- a/src/static_api.rs +++ b/src/static_api.rs @@ -25,6 +25,7 @@ impl<'a> Generator<'a> { self.generate_teams()?; self.generate_lists()?; self.generate_permissions()?; + self.generate_rfcbot()?; Ok(()) } @@ -112,6 +113,33 @@ impl<'a> Generator<'a> { Ok(()) } + fn generate_rfcbot(&self) -> Result<(), Error> { + let mut teams = IndexMap::new(); + + for team in self.data.teams() { + if let Some(rfcbot) = team.rfcbot_data() { + let mut members = team + .members(&self.data)? + .into_iter() + .map(|s| s.to_string()) + .collect::<Vec<_>>(); + members.sort(); + teams.insert( + rfcbot.label.clone(), + v1::RfcbotTeam { + name: rfcbot.name.clone(), + ping: rfcbot.ping.clone(), + members, + }, + ); + } + } + + teams.sort_keys(); + self.add("v1/rfcbot.json", &v1::Rfcbot { teams })?; + Ok(()) + } + fn add<T: serde::Serialize>(&self, path: &str, obj: &T) -> Result<(), Error> { info!("writing API object {}...", path); let dest = self.dest.join(path); diff --git a/src/validate.rs b/src/validate.rs index 90881fe..21570d2 100644 --- a/src/validate.rs +++ b/src/validate.rs @@ -18,6 +18,7 @@ static CHECKS: &[fn(&Data, &mut Vec<String>)] = &[ validate_discord_name, validate_duplicate_permissions, validate_permissions, + validate_rfcbot_labels, ]; pub(crate) fn validate(data: &Data) -> Result<(), Error> { @@ -284,6 +285,19 @@ fn validate_permissions(data: &Data, errors: &mut Vec<String>) { }); } +/// Ensure there are no duplicate rfcbot labels +fn validate_rfcbot_labels(data: &Data, errors: &mut Vec<String>) { + let mut labels = HashSet::new(); + wrapper(data.teams(), errors, move |team, errors| { + if let Some(rfcbot) = team.rfcbot_data() { + if !labels.insert(rfcbot.label.clone()) { + errors.push(format!("duplicate rfcbot label: {}", rfcbot.label)); + } + } + Ok(()) + }); +} + fn wrapper<T, I, F>(iter: I, errors: &mut Vec<String>, mut func: F) where I: Iterator<Item = T>, |