use rocket::{ get, http::{Cookie, CookieJar, Header}, response::{self, Responder}, Request, }; pub struct Reload(f64, pub T); #[rocket::async_trait] impl<'r, T: Responder<'r, 'static>> Responder<'r, 'static> for Reload { 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 { 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::(); Reload(if frame >= END_FRAME { 60.0 } else { 0.1 }, text) } #[inline] fn frag(i: isize, frame: isize) -> bool { i % 5 < (frame - i / 100) }