@@ -30,14 +30,21 @@ mod redirect;
30
30
mod rust_version;
31
31
mod teams;
32
32
33
+ use cache:: Cache ;
34
+ use cache:: Cached ;
33
35
use production:: User ;
36
+ use rocket:: tokio:: sync:: RwLock ;
37
+ use rust_version:: RustReleasePost ;
38
+ use rust_version:: RustVersion ;
34
39
use teams:: encode_zulip_stream;
40
+ use teams:: RustTeams ;
35
41
36
42
use std:: collections:: hash_map:: DefaultHasher ;
37
43
use std:: env;
38
44
use std:: fs;
39
45
use std:: hash:: Hasher ;
40
46
use std:: path:: { Path , PathBuf } ;
47
+ use std:: sync:: Arc ;
41
48
42
49
use rand:: seq:: SliceRandom ;
43
50
@@ -182,13 +189,20 @@ fn robots_txt() -> Option<content::RawText<&'static str>> {
182
189
}
183
190
184
191
#[ get( "/" ) ]
185
- async fn index ( ) -> Template {
186
- render_index ( ENGLISH . into ( ) ) . await
192
+ async fn index (
193
+ version_cache : & Cache < RustVersion > ,
194
+ release_post_cache : & Cache < RustReleasePost > ,
195
+ ) -> Template {
196
+ render_index ( ENGLISH . into ( ) , version_cache, release_post_cache) . await
187
197
}
188
198
189
199
#[ get( "/<locale>" , rank = 3 ) ]
190
- async fn index_locale ( locale : SupportedLocale ) -> Template {
191
- render_index ( locale. 0 ) . await
200
+ async fn index_locale (
201
+ locale : SupportedLocale ,
202
+ version_cache : & Cache < RustVersion > ,
203
+ release_post_cache : & Cache < RustReleasePost > ,
204
+ ) -> Template {
205
+ render_index ( locale. 0 , version_cache, release_post_cache) . await
192
206
}
193
207
194
208
#[ get( "/<category>" ) ]
@@ -202,27 +216,35 @@ fn category_locale(category: Category, locale: SupportedLocale) -> Template {
202
216
}
203
217
204
218
#[ get( "/governance" ) ]
205
- async fn governance ( ) -> Result < Template , Status > {
206
- render_governance ( ENGLISH . into ( ) ) . await
219
+ async fn governance ( teams_cache : & Cache < RustTeams > ) -> Result < Template , Status > {
220
+ render_governance ( ENGLISH . into ( ) , teams_cache ) . await
207
221
}
208
222
209
223
#[ get( "/governance/<section>/<team>" , rank = 2 ) ]
210
- async fn team ( section : String , team : String ) -> Result < Template , Result < Redirect , Status > > {
211
- render_team ( section, team, ENGLISH . into ( ) ) . await
224
+ async fn team (
225
+ section : String ,
226
+ team : String ,
227
+ teams_cache : & Cache < RustTeams > ,
228
+ ) -> Result < Template , Result < Redirect , Status > > {
229
+ render_team ( section, team, ENGLISH . into ( ) , teams_cache) . await
212
230
}
213
231
214
232
#[ get( "/<locale>/governance" , rank = 8 ) ]
215
- async fn governance_locale ( locale : SupportedLocale ) -> Result < Template , Status > {
216
- render_governance ( locale. 0 ) . await
233
+ async fn governance_locale (
234
+ locale : SupportedLocale ,
235
+ teams_cache : & Cache < RustTeams > ,
236
+ ) -> Result < Template , Status > {
237
+ render_governance ( locale. 0 , teams_cache) . await
217
238
}
218
239
219
240
#[ get( "/<locale>/governance/<section>/<team>" , rank = 12 ) ]
220
241
async fn team_locale (
221
242
section : String ,
222
243
team : String ,
223
244
locale : SupportedLocale ,
245
+ teams_cache : & Cache < RustTeams > ,
224
246
) -> Result < Template , Result < Redirect , Status > > {
225
- render_team ( section, team, locale. 0 ) . await
247
+ render_team ( section, team, locale. 0 , teams_cache ) . await
226
248
}
227
249
228
250
#[ get( "/production/users" ) ]
@@ -344,19 +366,26 @@ fn concat_app_js(files: Vec<&str>) -> String {
344
366
String :: from ( & js_path[ 1 ..] )
345
367
}
346
368
347
- async fn render_index ( lang : String ) -> Template {
369
+ async fn render_index (
370
+ lang : String ,
371
+ version_cache : & Cache < RustVersion > ,
372
+ release_post_cache : & Cache < RustReleasePost > ,
373
+ ) -> Template {
348
374
#[ derive( Serialize ) ]
349
375
struct IndexData {
350
376
rust_version : String ,
351
377
rust_release_post : String ,
352
378
}
353
379
354
380
let page = "index" . to_string ( ) ;
381
+ let release_post = rust_version:: rust_release_post ( release_post_cache) . await ;
355
382
let data = IndexData {
356
- rust_version : rust_version:: rust_version ( ) . await . unwrap_or_default ( ) ,
357
- rust_release_post : rust_version:: rust_release_post ( )
358
- . await
359
- . map_or_else ( String :: new, |v| format ! ( "https://blog.rust-lang.org/{}" , v) ) ,
383
+ rust_version : rust_version:: rust_version ( version_cache) . await ,
384
+ rust_release_post : if !release_post. is_empty ( ) {
385
+ format ! ( "https://blog.rust-lang.org/{}" , release_post)
386
+ } else {
387
+ String :: new ( )
388
+ } ,
360
389
} ;
361
390
let context = Context :: new ( page. clone ( ) , "" , true , data, lang) ;
362
391
Template :: render ( page, context)
@@ -383,8 +412,11 @@ fn render_production(lang: String) -> Template {
383
412
Template :: render ( page, context)
384
413
}
385
414
386
- async fn render_governance ( lang : String ) -> Result < Template , Status > {
387
- match teams:: index_data ( ) . await {
415
+ async fn render_governance (
416
+ lang : String ,
417
+ teams_cache : & Cache < RustTeams > ,
418
+ ) -> Result < Template , Status > {
419
+ match teams:: index_data ( teams_cache) . await {
388
420
Ok ( data) => {
389
421
let page = "governance/index" . to_string ( ) ;
390
422
let context = Context :: new ( page. clone ( ) , "governance-page-title" , false , data, lang) ;
@@ -402,8 +434,9 @@ async fn render_team(
402
434
section : String ,
403
435
team : String ,
404
436
lang : String ,
437
+ teams_cache : & Cache < RustTeams > ,
405
438
) -> Result < Template , Result < Redirect , Status > > {
406
- match teams:: page_data ( & section, & team) . await {
439
+ match teams:: page_data ( & section, & team, teams_cache ) . await {
407
440
Ok ( data) => {
408
441
let page = "governance/group" . to_string ( ) ;
409
442
let name = format ! ( "governance-team-{}-name" , data. team. name) ;
@@ -448,7 +481,7 @@ fn render_subject(category: Category, subject: String, lang: String) -> Result<T
448
481
}
449
482
450
483
#[ launch]
451
- fn rocket ( ) -> _ {
484
+ async fn rocket ( ) -> _ {
452
485
let templating = Template :: custom ( |engine| {
453
486
engine
454
487
. handlebars
@@ -461,9 +494,16 @@ fn rocket() -> _ {
461
494
. register_helper ( "encode-zulip-stream" , Box :: new ( encode_zulip_stream) ) ;
462
495
} ) ;
463
496
497
+ let rust_version = RustVersion :: fetch ( ) . await . unwrap_or_default ( ) ;
498
+ let rust_release_post = RustReleasePost :: fetch ( ) . await . unwrap_or_default ( ) ;
499
+ let teams = RustTeams :: fetch ( ) . await . unwrap_or_default ( ) ;
500
+
464
501
rocket:: build ( )
465
502
. attach ( templating)
466
503
. attach ( headers:: InjectHeaders )
504
+ . manage ( Arc :: new ( RwLock :: new ( rust_version) ) )
505
+ . manage ( Arc :: new ( RwLock :: new ( rust_release_post) ) )
506
+ . manage ( Arc :: new ( RwLock :: new ( teams) ) )
467
507
. mount (
468
508
"/" ,
469
509
routes ! [
0 commit comments