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
51
52
53
54
55
56
57
58
59
60
61
62
|
#![feature(ip_bits)]
pub mod embed;
pub mod error;
pub mod info;
pub mod state;
use embed::*;
use info::*;
use markup::Render;
use rocket::{
catch, catchers,
fairing::AdHoc,
http::{ContentType, Header, Status},
response::{self, Responder},
routes, Request, Response,
};
use state::{Config, Logic};
use std::io::Cursor;
#[rocket::main]
async fn main() {
env_logger::init_from_env("LOG");
let config = std::env::args()
.nth(1)
.expect("first arg needs to be the config");
let config = rocket::tokio::fs::read_to_string(config)
.await
.expect("could not read config");
let config: Config = serde_yaml::from_str(config.as_str()).expect("config invalid");
let state = Logic::new(config);
let _ = rocket::build()
.attach(AdHoc::on_response("set server header", |_req, res| {
res.set_header(Header::new("server", "meta adservices"));
Box::pin(async {})
}))
.manage(state)
.mount("/", routes![r_index, r_embed, r_style, r_image])
.register("/", catchers![r_catch])
.launch()
.await
.unwrap();
}
pub struct Template<T>(pub T);
impl<'r, T: Render> Responder<'r, 'static> for Template<T> {
fn respond_to(self, _req: &'r Request<'_>) -> response::Result<'static> {
let mut out = String::new();
self.0.render(&mut out).unwrap();
Response::build()
.header(ContentType::HTML)
.streamed_body(Cursor::new(out))
.ok()
}
}
#[catch(default)]
pub fn r_catch<'a>(status: Status, _request: &Request) -> String {
format!("{status}; This ad is likely misconfigured. Server could also be broken...")
}
|