1#![allow(rustdoc::bare_urls)]
2#![doc = include_str!("../README.md")]
3
4#[macro_use]
5extern crate actix_web;
6
7use std::io;
8
9use actix_web::{middleware, web, App, HttpServer};
10
11mod constant;
13mod routes;
15mod squire;
17mod templates;
19mod resources;
21mod legacy;
23
24pub async fn start() -> io::Result<()> {
42 let metadata = constant::build_info();
43 let config = squire::startup::get_config(&metadata);
44
45 squire::startup::init_logger(config.debug, config.utc_logging, &metadata.crate_name);
46 println!("{}[v{}] - {}", &metadata.pkg_name, &metadata.pkg_version, &metadata.description);
47 squire::ascii_art::random();
48
49 let config_clone = config.clone();
51 let host = format!("{}:{}", config.host, config.port);
52 log::info!("{} [workers:{}] running on http://{} (Press CTRL+C to quit)",
53 &metadata.pkg_name, &config.workers, &host);
54 let jinja = templates::environment();
55 let fernet = constant::fernet_object();
56 let session = constant::session_info();
57 let application = move || {
63 App::new() .app_data(web::Data::new(config_clone.clone()))
65 .app_data(web::Data::new(jinja.clone()))
66 .app_data(web::Data::new(fernet.clone()))
67 .app_data(web::Data::new(session.clone()))
68 .app_data(web::Data::new(metadata.clone()))
69 .wrap(squire::middleware::get_cors(config_clone.websites.clone()))
70 .wrap(middleware::Logger::default()) .service(routes::basics::health) .service(routes::basics::root)
73 .service(routes::basics::health) .service(routes::auth::login)
75 .service(routes::monitor::monitor)
76 .service(routes::auth::logout)
77 .service(routes::auth::error)
78 .configure(routes::configure_websocket)
79 };
80 let server = HttpServer::new(application)
81 .workers(config.workers)
82 .max_connections(config.max_connections);
83 match server.bind(host) {
84 Ok(bound_server) => bound_server.run().await,
85 Err(err) => {
86 log::error!("Failed to bind server: {}", err);
87 Err(err)
88 }
89 }
90}