99bebc3cd7aa284c6995acb3ce4c78b2a52bfa28
[valheim_web.git] / backend / src / main.rs
1
2 extern crate listenfd;
3 extern crate askama;
4
5 use listenfd::ListenFd;
6 use actix_files as fs;
7 use actix_web::{ get, web, Responder, middleware, App, HttpServer, web::Query };
8 use askama::Template;
9
10 use std::{ sync::Mutex, fs::File, env::args, io::prelude::* };
11 use ron::{ de::from_reader, ser::{ to_string_pretty, PrettyConfig } };
12 use serde::{ Deserialize, Serialize };
13
14 mod consts;
15
16 #[derive(Template)]
17 #[template(path = "main.html")]
18 struct MainTemplate {
19 sentence: String,
20 }
21
22 #[derive(Deserialize)]
23 pub struct Request {
24 m: Option<String>
25 }
26
27 #[get("/")]
28 async fn main_page(/*key_shared: web::Data<Mutex<String>>,*/ query: Query<Request>) -> impl Responder {
29 //let key = key_shared.lock().unwrap();
30
31 let m = String::from("hello");
32 MainTemplate { sentence: m }
33 }
34
35 #[derive(Debug, Deserialize, Serialize)]
36 struct Config {
37 port: u16
38 }
39
40 const DEFAULT_CONFIG: Config = Config { port: 8082 };
41
42 fn get_exe_name() -> String {
43 let first_arg = std::env::args().next().unwrap();
44 let sep: &[_] = &['\\', '/'];
45 first_arg[first_arg.rfind(sep).unwrap()+1..].to_string()
46 }
47
48 fn load_config() -> Config {
49 // unwrap_or_else(|_| panic!("Failed to open configuration file {}", consts::FILE_CONF));
50 match File::open(consts::FILE_CONF) {
51 Ok(file) => from_reader(file).unwrap_or_else(|_| panic!("Failed to open configuration file {}", consts::FILE_CONF)),
52 Err(_) => {
53 let mut file = File::create(consts::FILE_CONF) .unwrap();
54 file.write_all(to_string_pretty(&DEFAULT_CONFIG, PrettyConfig::new()).unwrap().as_bytes()).unwrap(); // We do not use 'to_writer' because it can't pretty format the output.
55 DEFAULT_CONFIG
56 }
57 }
58 }
59
60 #[actix_rt::main]
61 async fn main() -> std::io::Result<()> {
62
63 if process_args() { return Ok(()) }
64
65 println!("Starting RUP as web server...");
66
67 let config = load_config();
68
69 println!("Configuration: {:?}", config);
70
71 let mut listenfd = ListenFd::from_env();
72 let mut server =
73 HttpServer::new(
74 move || {
75 App::new()
76 // .app_data(key_shared.clone())
77 .wrap(middleware::Compress::default())
78 .wrap(middleware::Logger::default())
79 .service(main_page)
80 .service(fs::Files::new("/static", "static").show_files_listing())
81 }
82 );
83
84 server =
85 if let Some(l) = listenfd.take_tcp_listener(0).unwrap() {
86 server.listen(l).unwrap()
87 } else {
88 server.bind(&format!("0.0.0.0:{}", config.port)).unwrap()
89 };
90
91 server.run().await
92 }
93
94 fn process_args() -> bool {
95 fn print_usage() {
96 println!("Usage:");
97 println!(" {} [--help]", get_exe_name());
98 }
99
100 let args: Vec<String> = args().collect();
101
102 if args.iter().any(|arg| arg == "--help") {
103 print_usage();
104 return true
105 }
106
107 false
108 }