7a179af2ef6d935bdfd003bd82ae7061f639755a
[rup.git] / src / main.rs
1 extern crate actix_web;
2 extern crate listenfd;
3 extern crate askama;
4
5 use listenfd::ListenFd;
6 use actix_files as fs;
7 use actix_web::{web, middleware, App, HttpServer, HttpResponse, Responder, Result, web::Query};
8 use askama::Template;
9
10 use ron::de::from_reader;
11 use serde::Deserialize;
12 use std::fs::File;
13
14 mod consts;
15 mod crypto;
16
17 #[derive(Template)]
18 #[template(path = "main.html")]
19 struct MainTemplate<'a> {
20 sentence: &'a str,
21 }
22
23 #[derive(Deserialize)]
24 pub struct Request {
25 m: Option<String>
26 }
27
28 static DEFAULT_MESSAGE: &str = "Marc, roule un pet'!";
29 static KEY: &str = "secret";
30
31 fn main_page(query: Query<Request>) -> Result<HttpResponse> {
32 let m =
33 match &query.m {
34 Some(b) =>
35 match crypto::decrypt(KEY, b) {
36 Some(m) => m,
37 None => String::from(DEFAULT_MESSAGE)
38 },
39 None => String::from(DEFAULT_MESSAGE)
40 };
41
42 let hello = MainTemplate { sentence: &m };
43
44 let s = hello.render().unwrap();
45 Ok(HttpResponse::Ok().content_type("text/html").body(s))
46 }
47
48 #[derive(Debug, Deserialize)]
49 struct Config {
50 port: u16
51 }
52
53 fn main() -> std::io::Result<()> {
54 println!("Starting RUP...");
55
56 let config: Config = {
57 let f = File::open(consts::FILE_CONF).expect(&format!("Failed to open configuration file {}", consts::FILE_CONF));
58 match from_reader(f) {
59 Ok(c) => c,
60 Err(e) => panic!("Failed to load config: {}", e)
61 }
62 };
63
64 println!("Configuration: {:?}", config);
65
66 let mut listenfd = ListenFd::from_env();
67 let mut server =
68 HttpServer::new(
69 || {
70 App::new()
71 .wrap(middleware::Compress::default())
72 .wrap(middleware::Logger::default())
73 .service(web::resource("/").to(main_page))
74 .service(fs::Files::new("/static", "static").show_files_listing())
75 }
76 );
77
78 server =
79 if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
80 server.listen(l).unwrap()
81 } else {
82 server.bind(&format!("0.0.0.0:{}", config.port)).unwrap()
83 };
84
85 server.run()
86 }