Skip to content

Commit bb1838f

Browse files
committed
Extract out a function for converting teams to the v1 format
1 parent c4e4239 commit bb1838f

File tree

1 file changed

+124
-114
lines changed

1 file changed

+124
-114
lines changed

src/static_api.rs

Lines changed: 124 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::data::Data;
2+
use crate::schema;
23
use crate::schema::{Bot, Email, MergeBot, Permissions, RepoPermission, TeamKind, ZulipMember};
34
use anyhow::{ensure, Context as _, Error};
45
use indexmap::IndexMap;
@@ -162,121 +163,10 @@ impl<'a> Generator<'a> {
162163
}
163164

164165
fn generate_teams(&self) -> Result<(), Error> {
165-
let mut teams = IndexMap::new();
166-
167-
for team in self.data.teams() {
168-
let mut website_roles = HashMap::new();
169-
for member in team.explicit_members().iter().cloned() {
170-
website_roles.insert(member.github, member.roles);
171-
}
172-
for alum in team.explicit_alumni().iter().cloned() {
173-
website_roles.insert(alum.github, alum.roles);
174-
}
175-
176-
let leads = team.leads();
177-
let mut members = Vec::new();
178-
for github_name in &team.members(self.data)? {
179-
if let Some(person) = self.data.person(github_name) {
180-
members.push(v1::TeamMember {
181-
name: person.name().into(),
182-
github: (*github_name).into(),
183-
github_id: person.github_id(),
184-
is_lead: leads.contains(github_name),
185-
roles: website_roles.get(*github_name).cloned().unwrap_or_default(),
186-
});
187-
}
188-
}
189-
members.sort_by_key(|member| member.github.to_lowercase());
190-
members.sort_by_key(|member| !member.is_lead);
191-
192-
let mut alumni = Vec::new();
193-
for alum in team.explicit_alumni() {
194-
if let Some(person) = self.data.person(&alum.github) {
195-
alumni.push(v1::TeamMember {
196-
name: person.name().into(),
197-
github: alum.github.to_string(),
198-
github_id: person.github_id(),
199-
is_lead: false,
200-
roles: website_roles
201-
.get(alum.github.as_str())
202-
.cloned()
203-
.unwrap_or_default(),
204-
});
205-
}
206-
}
207-
alumni.sort_by_key(|member| member.github.to_lowercase());
208-
209-
let mut github_teams = team.github_teams(self.data)?;
210-
github_teams.sort();
211-
212-
let mut member_discord_ids = team.discord_ids(self.data)?;
213-
member_discord_ids.sort();
214-
215-
let team_data = v1::Team {
216-
name: team.name().into(),
217-
kind: match team.kind() {
218-
TeamKind::Team => v1::TeamKind::Team,
219-
TeamKind::WorkingGroup => v1::TeamKind::WorkingGroup,
220-
TeamKind::ProjectGroup => v1::TeamKind::ProjectGroup,
221-
TeamKind::MarkerTeam => v1::TeamKind::MarkerTeam,
222-
},
223-
subteam_of: team.subteam_of().map(|st| st.into()),
224-
top_level: team.top_level(),
225-
members,
226-
alumni,
227-
github: Some(v1::TeamGitHub {
228-
teams: github_teams
229-
.into_iter()
230-
.map(|team| v1::GitHubTeam {
231-
org: team.org.to_string(),
232-
name: team.name.to_string(),
233-
members: team.members.into_iter().map(|(_, id)| id).collect(),
234-
})
235-
.collect::<Vec<_>>(),
236-
})
237-
.filter(|gh| !gh.teams.is_empty()),
238-
website_data: team.website_data().map(|ws| v1::TeamWebsite {
239-
name: ws.name().into(),
240-
description: ws.description().into(),
241-
page: ws.page().unwrap_or_else(|| team.name()).into(),
242-
email: ws.email().map(|e| e.into()),
243-
repo: ws.repo().map(|e| e.into()),
244-
discord: ws.discord().map(|i| v1::DiscordInvite {
245-
channel: i.channel.into(),
246-
url: i.url.into(),
247-
}),
248-
zulip_stream: ws.zulip_stream().map(|s| s.into()),
249-
matrix_room: ws.matrix_room().map(|s| s.into()),
250-
weight: ws.weight(),
251-
}),
252-
roles: team
253-
.roles()
254-
.iter()
255-
.map(|role| v1::MemberRole {
256-
id: role.id.clone(),
257-
description: role.description.clone(),
258-
})
259-
.collect(),
260-
discord: team
261-
.discord_roles()
262-
.map(|roles| {
263-
roles
264-
.iter()
265-
.map(|role| v1::TeamDiscord {
266-
name: role.name().into(),
267-
color: role.color().map(String::from),
268-
members: member_discord_ids.clone(),
269-
})
270-
.collect()
271-
})
272-
.unwrap_or_else(Vec::new),
273-
};
274-
275-
self.add(&format!("v1/teams/{}.json", team.name()), &team_data)?;
276-
teams.insert(team.name().into(), team_data);
166+
let teams = convert_teams(&self.data, self.data.teams())?;
167+
for (name, team) in &teams {
168+
self.add(&format!("v1/teams/{name}.json"), team)?;
277169
}
278-
279-
teams.sort_keys();
280170
self.add("v1/teams.json", &v1::Teams { teams })?;
281171
Ok(())
282172
}
@@ -529,3 +419,123 @@ impl<'a> Generator<'a> {
529419
Ok(())
530420
}
531421
}
422+
423+
fn convert_teams<'a>(
424+
data: &Data,
425+
teams: impl Iterator<Item = &'a schema::Team>,
426+
) -> anyhow::Result<IndexMap<String, v1::Team>> {
427+
let mut team_map = IndexMap::new();
428+
429+
for team in teams {
430+
let mut website_roles = HashMap::new();
431+
for member in team.explicit_members().iter().cloned() {
432+
website_roles.insert(member.github, member.roles);
433+
}
434+
for alum in team.explicit_alumni().iter().cloned() {
435+
website_roles.insert(alum.github, alum.roles);
436+
}
437+
438+
let leads = team.leads();
439+
let mut members = Vec::new();
440+
for github_name in &team.members(data)? {
441+
if let Some(person) = data.person(github_name) {
442+
members.push(v1::TeamMember {
443+
name: person.name().into(),
444+
github: (*github_name).into(),
445+
github_id: person.github_id(),
446+
is_lead: leads.contains(github_name),
447+
roles: website_roles.get(*github_name).cloned().unwrap_or_default(),
448+
});
449+
}
450+
}
451+
members.sort_by_key(|member| member.github.to_lowercase());
452+
members.sort_by_key(|member| !member.is_lead);
453+
454+
let mut alumni = Vec::new();
455+
for alum in team.explicit_alumni() {
456+
if let Some(person) = data.person(&alum.github) {
457+
alumni.push(v1::TeamMember {
458+
name: person.name().into(),
459+
github: alum.github.to_string(),
460+
github_id: person.github_id(),
461+
is_lead: false,
462+
roles: website_roles
463+
.get(alum.github.as_str())
464+
.cloned()
465+
.unwrap_or_default(),
466+
});
467+
}
468+
}
469+
alumni.sort_by_key(|member| member.github.to_lowercase());
470+
471+
let mut github_teams = team.github_teams(data)?;
472+
github_teams.sort();
473+
474+
let mut member_discord_ids = team.discord_ids(data)?;
475+
member_discord_ids.sort();
476+
477+
let team_data = v1::Team {
478+
name: team.name().into(),
479+
kind: match team.kind() {
480+
TeamKind::Team => v1::TeamKind::Team,
481+
TeamKind::WorkingGroup => v1::TeamKind::WorkingGroup,
482+
TeamKind::ProjectGroup => v1::TeamKind::ProjectGroup,
483+
TeamKind::MarkerTeam => v1::TeamKind::MarkerTeam,
484+
},
485+
subteam_of: team.subteam_of().map(|st| st.into()),
486+
top_level: team.top_level(),
487+
members,
488+
alumni,
489+
github: Some(v1::TeamGitHub {
490+
teams: github_teams
491+
.into_iter()
492+
.map(|team| v1::GitHubTeam {
493+
org: team.org.to_string(),
494+
name: team.name.to_string(),
495+
members: team.members.into_iter().map(|(_, id)| id).collect(),
496+
})
497+
.collect::<Vec<_>>(),
498+
})
499+
.filter(|gh| !gh.teams.is_empty()),
500+
website_data: team.website_data().map(|ws| v1::TeamWebsite {
501+
name: ws.name().into(),
502+
description: ws.description().into(),
503+
page: ws.page().unwrap_or_else(|| team.name()).into(),
504+
email: ws.email().map(|e| e.into()),
505+
repo: ws.repo().map(|e| e.into()),
506+
discord: ws.discord().map(|i| v1::DiscordInvite {
507+
channel: i.channel.into(),
508+
url: i.url.into(),
509+
}),
510+
zulip_stream: ws.zulip_stream().map(|s| s.into()),
511+
matrix_room: ws.matrix_room().map(|s| s.into()),
512+
weight: ws.weight(),
513+
}),
514+
roles: team
515+
.roles()
516+
.iter()
517+
.map(|role| v1::MemberRole {
518+
id: role.id.clone(),
519+
description: role.description.clone(),
520+
})
521+
.collect(),
522+
discord: team
523+
.discord_roles()
524+
.map(|roles| {
525+
roles
526+
.iter()
527+
.map(|role| v1::TeamDiscord {
528+
name: role.name().into(),
529+
color: role.color().map(String::from),
530+
members: member_discord_ids.clone(),
531+
})
532+
.collect()
533+
})
534+
.unwrap_or_else(Vec::new),
535+
};
536+
team_map.insert(team.name().into(), team_data);
537+
}
538+
539+
team_map.sort_keys();
540+
Ok(team_map)
541+
}

0 commit comments

Comments
 (0)