@@ -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+
110149impl 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 }
0 commit comments