Skip to content

Commit 6c8e4ec

Browse files
committed
Add fallback for role descriptions
1 parent 19c4b4f commit 6c8e4ec

File tree

5 files changed

+64
-13
lines changed

5 files changed

+64
-13
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n.rs

+61-5
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,45 @@ impl Default for TeamHelper {
107107
}
108108
}
109109

110+
enum TeamHelperParam {
111+
/// `{{team-text team name}}`
112+
Name,
113+
114+
/// `{{team-text team description}}`
115+
Description,
116+
117+
/// `{{team-text team role (lookup member.roles 0)}}`
118+
Role(String),
119+
}
120+
121+
impl TeamHelperParam {
122+
fn fluent_id(&self, team_name: &str) -> String {
123+
match self {
124+
TeamHelperParam::Name => format!("governance-team-{team_name}-name"),
125+
TeamHelperParam::Description => format!("governance-team-{team_name}-description"),
126+
TeamHelperParam::Role(role_id) => format!("governance-role-{role_id}"),
127+
}
128+
}
129+
130+
fn english<'a>(&'a self, team: &'a serde_json::Value) -> &'a str {
131+
match self {
132+
TeamHelperParam::Name => team["website_data"]["name"].as_str().unwrap(),
133+
TeamHelperParam::Description => team["website_data"]["description"].as_str().unwrap(),
134+
TeamHelperParam::Role(role_id) => {
135+
for role in team["roles"].as_array().unwrap() {
136+
if role["id"] == *role_id {
137+
return role["description"].as_str().unwrap();
138+
}
139+
}
140+
// This should never happen. The `validate_member_roles` test in
141+
// the team repo enforces that `.members.*.roles.*` lines up
142+
// with exactly one `.roles.*.id`.
143+
role_id
144+
}
145+
}
146+
}
147+
}
148+
110149
impl HelperDef for TeamHelper {
111150
fn call<'reg: 'rc, 'rc>(
112151
&self,
@@ -137,6 +176,25 @@ impl HelperDef for TeamHelper {
137176
"{{team-text}} takes only identifier parameters",
138177
));
139178
};
179+
180+
let param = match id.as_str() {
181+
"name" => TeamHelperParam::Name,
182+
"description" => TeamHelperParam::Description,
183+
"role" => {
184+
let Some(role_id) = h.param(2) else {
185+
return Err(RenderError::new(
186+
"{{team-text}} requires a third parameter for the role id",
187+
));
188+
};
189+
TeamHelperParam::Role(role_id.value().as_str().unwrap().to_owned())
190+
}
191+
unrecognized => {
192+
return Err(RenderError::new(format!(
193+
"unrecognized {{{{team-text}}}} param {unrecognized:?}",
194+
)));
195+
}
196+
};
197+
140198
let team = rcx
141199
.evaluate(context, name)
142200
.map_err(|e| RenderError::from_error(&format!("Cannot find team {}", name), e))?;
@@ -148,22 +206,20 @@ impl HelperDef for TeamHelper {
148206
.expect("Language must be string");
149207
let team_name = team.as_json()["name"].as_str().unwrap();
150208

151-
let fluent_id = format!("governance-team-{}-{}", team_name, id);
152-
153209
// English uses the team data directly, so that it gets autoupdated
154210
if lang == "en-US" {
155-
let english = team.as_json()["website_data"][id].as_str().unwrap();
211+
let english = param.english(team.as_json());
156212
out.write(english)
157213
.map_err(|e| RenderError::from_error("failed to render English team data", e))?;
158214
} else if let Some(value) = self.i18n.lookup_no_default_fallback(
159215
&lang.parse().expect("language must be valid"),
160-
&fluent_id,
216+
&param.fluent_id(team_name),
161217
None,
162218
) {
163219
out.write(&value)
164220
.map_err(|e| RenderError::from_error("failed to render translated team data", e))?;
165221
} else {
166-
let english = team.as_json()["website_data"][id].as_str().unwrap();
222+
let english = param.english(team.as_json());
167223
out.write(english)
168224
.map_err(|e| RenderError::from_error("failed to render", e))?;
169225
}

src/main.rs

-6
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ use sass_rs::{compile_file, Options};
5959
use category::Category;
6060

6161
use caching::CachedNamedFile;
62-
use handlebars::handlebars_helper;
6362
use handlebars_fluent::{loader::Loader, FluentHelper};
6463
use i18n::{create_loader, LocaleInfo, SupportedLocale, TeamHelper, EXPLICIT_LOCALE_INFO};
6564

@@ -492,11 +491,6 @@ async fn rocket() -> _ {
492491
engine
493492
.handlebars
494493
.register_helper("encode-zulip-stream", Box::new(encode_zulip_stream));
495-
496-
handlebars_helper!(concat: |x: String, y: String| x + &y);
497-
engine
498-
.handlebars
499-
.register_helper("concat", Box::new(concat));
500494
});
501495

502496
let rust_version = RustVersion::fetch().await.unwrap_or_default();

src/teams.rs

+1
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ mod tests {
334334
zulip_stream: None,
335335
weight: 0,
336336
}),
337+
roles: Vec::new(),
337338
github: None,
338339
discord: vec![],
339340
}

templates/governance/group-team.html.hbs

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
<div>{{fluent "governance-user-team-leader"}}</div>
6363
{{else}}
6464
{{#if member.roles}}
65-
<div>{{fluent (concat "governance-role-" (lookup member.roles 0))}}</div>
65+
<div>{{team-text team role (lookup member.roles 0)}}</div>
6666
{{/if}}
6767
{{/if}}
6868
</div>

0 commit comments

Comments
 (0)