aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 8a2098266c8f27059a32d662c9e04f14857cf14a (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
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...")
}