Update dependencies (actix-web 2)
[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::{get, web, Responder, middleware, App, HttpServer, HttpResponse, 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 mod db;
17
18 #[derive(Template)]
19 #[template(path = "main.html")]
20 struct MainTemplate<'a> {
21 test: &'a str,
22 }
23
24 #[derive(Deserialize)]
25 pub struct Request {
26 m: Option<String>
27 }
28
29 fn main_page(query: Query<Request>) -> HttpResponse {
30
31 let main_template = MainTemplate { test: &"*** test ***" };
32
33 let s = main_template.render().unwrap();
34 HttpResponse::Ok().content_type("text/html").body(s)
35 }
36
37 #[derive(Debug, Deserialize)]
38 struct Config {
39 port: u16
40 }
41
42 fn get_exe_name() -> String {
43 let first_arg = std::env::args().nth(0).unwrap();
44 let sep: &[_] = &['\\', '/'];
45 first_arg[first_arg.rfind(sep).unwrap()+1..].to_string()
46 }
47
48 #[actix_rt::main]
49 async fn main() -> std::io::Result<()> {
50 if process_args() { return Ok(()) }
51
52 println!("Starting RUP as web server...");
53
54 let config: Config = {
55 let f = File::open(consts::FILE_CONF).unwrap_or_else(|_| panic!("Failed to open configuration file {}", consts::FILE_CONF));
56 match from_reader(f) {
57 Ok(c) => c,
58 Err(e) => panic!("Failed to load config: {}", e)
59 }
60 };
61
62 println!("Configuration: {:?}", config);
63
64 // let database_connection = db::create_or_update();
65
66 std::env::set_var("RUST_LOG", "actix_web=info");
67 env_logger::init();
68
69 let mut listenfd = ListenFd::from_env();
70 let mut server =
71 HttpServer::new(
72 || {
73 App::new()
74 .wrap(middleware::Compress::default())
75 .wrap(Logger::default())
76 .wrap(Logger::new("%a %{User-Agent}i"))
77 .service(web::resource("/").to(main_page))
78 .service(fs::Files::new("/static", "static").show_files_listing())
79 }
80 );
81
82 server =
83 if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
84 server.listen(l).unwrap()
85 } else {
86 server.bind(&format!("0.0.0.0:{}", config.port)).unwrap()
87 };
88
89 server.run().await
90 }
91
92 fn process_args() -> bool {
93 fn print_usage() {
94 println!("Usage:");
95 println!(" {} [--help] [--test]", get_exe_name());
96 }
97
98 let args: Vec<String> = args().collect();
99
100 if args.iter().any(|arg| arg == "--help") {
101 print_usage();
102 return true
103 } else if args.iter().any(|arg| arg == "--test") {
104 let db_connection = db::Connection::new();
105 db_connection.create_or_update();
106 return true
107 }
108
109 false
110 }