@@ -107,6 +107,42 @@ 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 > ( & 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+ panic ! ( "no role {:?}" , role_id) ;
141+ }
142+ }
143+ }
144+ }
145+
110146impl HelperDef for TeamHelper {
111147 fn call < ' reg : ' rc , ' rc > (
112148 & self ,
@@ -137,6 +173,25 @@ impl HelperDef for TeamHelper {
137173 "{{team-text}} takes only identifier parameters" ,
138174 ) ) ;
139175 } ;
176+
177+ let param = match id. as_str ( ) {
178+ "name" => TeamHelperParam :: Name ,
179+ "description" => TeamHelperParam :: Description ,
180+ "role" => {
181+ let Some ( role_id) = h. param ( 2 ) else {
182+ return Err ( RenderError :: new (
183+ "{{team-text}} requires a third parameter for the role id" ,
184+ ) ) ;
185+ } ;
186+ TeamHelperParam :: Role ( role_id. value ( ) . as_str ( ) . unwrap ( ) . to_owned ( ) )
187+ }
188+ unrecognized => {
189+ return Err ( RenderError :: new ( format ! (
190+ "unrecognized {{{{team-text}}}} param {unrecognized:?}" ,
191+ ) ) ) ;
192+ }
193+ } ;
194+
140195 let team = rcx
141196 . evaluate ( context, name)
142197 . map_err ( |e| RenderError :: from_error ( & format ! ( "Cannot find team {}" , name) , e) ) ?;
@@ -148,22 +203,20 @@ impl HelperDef for TeamHelper {
148203 . expect ( "Language must be string" ) ;
149204 let team_name = team. as_json ( ) [ "name" ] . as_str ( ) . unwrap ( ) ;
150205
151- let fluent_id = format ! ( "governance-team-{}-{}" , team_name, id) ;
152-
153206 // English uses the team data directly, so that it gets autoupdated
154207 if lang == "en-US" {
155- let english = team. as_json ( ) [ "website_data" ] [ id ] . as_str ( ) . unwrap ( ) ;
208+ let english = param . english ( team. as_json ( ) ) ;
156209 out. write ( english)
157210 . map_err ( |e| RenderError :: from_error ( "failed to render English team data" , e) ) ?;
158211 } else if let Some ( value) = self . i18n . lookup_no_default_fallback (
159212 & lang. parse ( ) . expect ( "language must be valid" ) ,
160- & fluent_id,
213+ & param . fluent_id ( team_name ) ,
161214 None ,
162215 ) {
163216 out. write ( & value)
164217 . map_err ( |e| RenderError :: from_error ( "failed to render translated team data" , e) ) ?;
165218 } else {
166- let english = team. as_json ( ) [ "website_data" ] [ id ] . as_str ( ) . unwrap ( ) ;
219+ let english = param . english ( team. as_json ( ) ) ;
167220 out. write ( english)
168221 . map_err ( |e| RenderError :: from_error ( "failed to render" , e) ) ?;
169222 }
0 commit comments