@@ -107,6 +107,45 @@ impl Default for TeamHelper {
107
107
}
108
108
}
109
109
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
+
110
149
impl HelperDef for TeamHelper {
111
150
fn call < ' reg : ' rc , ' rc > (
112
151
& self ,
@@ -137,6 +176,25 @@ impl HelperDef for TeamHelper {
137
176
"{{team-text}} takes only identifier parameters" ,
138
177
) ) ;
139
178
} ;
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
+
140
198
let team = rcx
141
199
. evaluate ( context, name)
142
200
. map_err ( |e| RenderError :: from_error ( & format ! ( "Cannot find team {}" , name) , e) ) ?;
@@ -148,22 +206,20 @@ impl HelperDef for TeamHelper {
148
206
. expect ( "Language must be string" ) ;
149
207
let team_name = team. as_json ( ) [ "name" ] . as_str ( ) . unwrap ( ) ;
150
208
151
- let fluent_id = format ! ( "governance-team-{}-{}" , team_name, id) ;
152
-
153
209
// English uses the team data directly, so that it gets autoupdated
154
210
if lang == "en-US" {
155
- let english = team. as_json ( ) [ "website_data" ] [ id ] . as_str ( ) . unwrap ( ) ;
211
+ let english = param . english ( team. as_json ( ) ) ;
156
212
out. write ( english)
157
213
. map_err ( |e| RenderError :: from_error ( "failed to render English team data" , e) ) ?;
158
214
} else if let Some ( value) = self . i18n . lookup_no_default_fallback (
159
215
& lang. parse ( ) . expect ( "language must be valid" ) ,
160
- & fluent_id,
216
+ & param . fluent_id ( team_name ) ,
161
217
None ,
162
218
) {
163
219
out. write ( & value)
164
220
. map_err ( |e| RenderError :: from_error ( "failed to render translated team data" , e) ) ?;
165
221
} else {
166
- let english = team. as_json ( ) [ "website_data" ] [ id ] . as_str ( ) . unwrap ( ) ;
222
+ let english = param . english ( team. as_json ( ) ) ;
167
223
out. write ( english)
168
224
. map_err ( |e| RenderError :: from_error ( "failed to render" , e) ) ?;
169
225
}
0 commit comments