1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
use rocket::{
get,
http::{Cookie, CookieJar, Header},
response::{self, Responder},
Request,
};
pub struct Reload<T>(f64, pub T);
#[rocket::async_trait]
impl<'r, T: Responder<'r, 'static>> Responder<'r, 'static> for Reload<T> {
fn respond_to(self, request: &'r Request<'_>) -> response::Result<'static> {
let mut resp = self.1.respond_to(request);
if let Ok(resp) = &mut resp {
resp.set_header(Header::new("refresh", format!("{}", self.0)));
}
resp
}
}
const TEXT: &'static str = include_str!("../COPYING");
const END_FRAME: isize = TEXT.len() as isize / 100 + 5;
#[get("/wubbel")]
pub fn r_wubbel(jar: &CookieJar) -> Reload<String> {
let frame = jar
.get("frame")
.and_then(|c| c.value().parse().ok())
.unwrap_or(0isize);
jar.add(Cookie::build("frame", format!("{}", (frame + 1) % (END_FRAME + 1))).finish());
let text = TEXT
.chars()
.enumerate()
.map(|(i, e)| {
if e == '\n' || frag(i as isize, frame) {
e
} else {
' '
}
})
.collect::<String>();
Reload(if frame >= END_FRAME { 60.0 } else { 0.1 }, text)
}
#[inline]
fn frag(i: isize, frame: isize) -> bool {
i % 5 < (frame - i / 100)
}
|