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