summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPietro Albini <pietro@pietroalbini.org>2019-03-30 11:36:31 +0100
committerGitHub <noreply@github.com>2019-03-30 11:36:31 +0100
commit6aa6d5abcd02ce5cd36606bc458372e7c65a0f8b (patch)
tree135195fcead2412a93b1d2951675d89083ecaefa /src
parenta52b45a0a7e3d11132ab701b983a4aad2c4fb065 (diff)
parentb9db45fe621b57829556d35b132549a271dfe253 (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.rs13
-rw-r--r--src/static_api.rs28
-rw-r--r--src/validate.rs14
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>,