summaryrefslogtreecommitdiff
path: root/src/animation.rs
blob: bfb17a4ce2c13fdf664f16b2c30cf0e79fe7ca55 (plain)
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)
}