Add a logger (to stdout for the moment)
[recipes.git] / backend / src / main.rs
1 use std::io::prelude::*;
2 use std::{fs::File, env::args};
3
4 use actix_files as fs;
5 use actix_web::{web, middleware, App, HttpServer, HttpResponse, Result, web::Query, middleware::Logger};
6
7 use askama::Template;
8 use listenfd::ListenFd;
9 use ron::de::from_reader;
10 use serde::Deserialize;
11 use env_logger;
12
13 use itertools::Itertools;
14
15 mod consts;
16
17 #[derive(Template)]
18 #[template(path = "main.html")]
19 struct MainTemplate<'a> {
20 test: &'a str,
21 }
22
23 #[derive(Deserialize)]
24 pub struct Request {
25 m: Option<String>
26 }
27
28 fn main_page(query: Query<Request>) -> Result<HttpResponse> {
29
30 let main_template = MainTemplate { test: &"test" };
31
32 let s = main_template.render().unwrap();
33 Ok(HttpResponse::Ok().content_type("text/html").body(s))
34 }
35
36 #[derive(Debug, Deserialize)]
37 struct Config {
38 port: u16
39 }
40
41 fn get_exe_name() -> String {
42 let first_arg = std::env::args().nth(0).unwrap();
43 let sep: &[_] = &['\\', '/'];
44 first_arg[first_arg.rfind(sep).unwrap()+1..].to_string()
45 }
46
47 fn main() -> std::io::Result<()> {
48 if process_args() { return Ok(()) }
49
50 println!("Starting RUP as web server...");
51
52 let config: Config = {
53 let f = File::open(consts::FILE_CONF).unwrap_or_else(|_| panic!("Failed to open configuration file {}", consts::FILE_CONF));
54 match from_reader(f) {
55 Ok(c) => c,
56 Err(e) => panic!("Failed to load config: {}", e)
57 }
58 };
59
60 println!("Configuration: {:?}", config);
61
62 std::env::set_var("RUST_LOG", "actix_web=info");
63 env_logger::init();
64
65 let mut listenfd = ListenFd::from_env();
66 let mut server =
67 HttpServer::new(
68 || {
69 App::new()
70 .wrap(middleware::Compress::default())
71 .wrap(Logger::default())
72 .wrap(Logger::new("%a %{User-Agent}i"))
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 }
87
88 fn process_args() -> bool {
89 fn print_usage() {
90 println!("Usage:");
91 println!(" {} [--help]", get_exe_name());
92 }
93
94 let args: Vec<String> = args().collect();
95
96 if args.iter().any(|arg| arg == "--help") {
97 print_usage();
98 return true
99 }
100
101 false
102 }