Change the default font + other little things
[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};
6
7 use askama::Template;
8 use listenfd::ListenFd;
9 use ron::de::from_reader;
10 use serde::Deserialize;
11
12 use itertools::Itertools;
13
14 mod consts;
15 mod db;
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>) -> HttpResponse {
29
30 let main_template = MainTemplate { test: &"*** test ***" };
31
32 let s = main_template.render().unwrap();
33 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 #[actix_rt::main]
48 async fn main() -> std::io::Result<()> {
49 if process_args() { return Ok(()) }
50
51 println!("Starting Recipes as web server...");
52
53 let config: Config = {
54 let f = File::open(consts::FILE_CONF).unwrap_or_else(|_| panic!("Failed to open configuration file {}", consts::FILE_CONF));
55 match from_reader(f) {
56 Ok(c) => c,
57 Err(e) => panic!("Failed to load config: {}", e)
58 }
59 };
60
61 println!("Configuration: {:?}", config);
62
63 // let database_connection = db::create_or_update();
64
65 std::env::set_var("RUST_LOG", "actix_web=info");
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 .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().await
86 }
87
88 fn process_args() -> bool {
89 fn print_usage() {
90 println!("Usage:");
91 println!(" {} [--help] [--test]", 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 } else if args.iter().any(|arg| arg == "--test") {
100 let db_connection = db::Connection::new();
101 db_connection.create_or_update();
102 return true
103 }
104
105 false
106 }