|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | #![forbid(unsafe_code, clippy::panic)] | 
					
						
						|  | #![deny(missing_docs, clippy::missing_docs_in_private_items, clippy::perf)] | 
					
						
						|  | #![warn(clippy::cognitive_complexity, rust_2018_idioms)] | 
					
						
						|  |  | 
					
						
						|  | pub mod cache; | 
					
						
						|  | pub mod config; | 
					
						
						|  | pub mod engines; | 
					
						
						|  | pub mod handler; | 
					
						
						|  | pub mod models; | 
					
						
						|  | pub mod results; | 
					
						
						|  | pub mod server; | 
					
						
						|  |  | 
					
						
						|  | use std::net::TcpListener; | 
					
						
						|  |  | 
					
						
						|  | use crate::server::router; | 
					
						
						|  |  | 
					
						
						|  | use actix_cors::Cors; | 
					
						
						|  | use actix_files as fs; | 
					
						
						|  | use actix_governor::{Governor, GovernorConfigBuilder}; | 
					
						
						|  | use actix_web::{dev::Server, http::header, middleware::Logger, web, App, HttpServer}; | 
					
						
						|  | use cache::cacher::{Cache, SharedCache}; | 
					
						
						|  | use config::parser::Config; | 
					
						
						|  | use handlebars::Handlebars; | 
					
						
						|  | use handler::paths::{file_path, FileType}; | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  |  | 
					
						
						|  | pub fn run(listener: TcpListener, config: Config, cache: Cache) -> std::io::Result<Server> { | 
					
						
						|  | let mut handlebars: Handlebars<'_> = Handlebars::new(); | 
					
						
						|  |  | 
					
						
						|  | let public_folder_path: &str = file_path(FileType::Theme)?; | 
					
						
						|  |  | 
					
						
						|  | handlebars | 
					
						
						|  | .register_templates_directory(".html", format!("{}/templates", public_folder_path)) | 
					
						
						|  | .unwrap(); | 
					
						
						|  |  | 
					
						
						|  | let handlebars_ref: web::Data<Handlebars<'_>> = web::Data::new(handlebars); | 
					
						
						|  |  | 
					
						
						|  | let cloned_config_threads_opt: u8 = config.threads; | 
					
						
						|  |  | 
					
						
						|  | let cache = web::Data::new(SharedCache::new(cache)); | 
					
						
						|  |  | 
					
						
						|  | let server = HttpServer::new(move || { | 
					
						
						|  | let cors: Cors = Cors::default() | 
					
						
						|  | .allow_any_origin() | 
					
						
						|  | .allowed_methods(vec!["GET"]) | 
					
						
						|  | .allowed_headers(vec![ | 
					
						
						|  | header::ORIGIN, | 
					
						
						|  | header::CONTENT_TYPE, | 
					
						
						|  | header::REFERER, | 
					
						
						|  | header::COOKIE, | 
					
						
						|  | ]); | 
					
						
						|  |  | 
					
						
						|  | App::new() | 
					
						
						|  | .wrap(Logger::default()) | 
					
						
						|  | .app_data(handlebars_ref.clone()) | 
					
						
						|  | .app_data(web::Data::new(config.clone())) | 
					
						
						|  | .app_data(cache.clone()) | 
					
						
						|  | .wrap(cors) | 
					
						
						|  | .wrap(Governor::new( | 
					
						
						|  | &GovernorConfigBuilder::default() | 
					
						
						|  | .per_second(config.rate_limiter.time_limit as u64) | 
					
						
						|  | .burst_size(config.rate_limiter.number_of_requests as u32) | 
					
						
						|  | .finish() | 
					
						
						|  | .unwrap(), | 
					
						
						|  | )) | 
					
						
						|  |  | 
					
						
						|  | .service( | 
					
						
						|  | fs::Files::new("/static", format!("{}/static", public_folder_path)) | 
					
						
						|  | .show_files_listing(), | 
					
						
						|  | ) | 
					
						
						|  | .service( | 
					
						
						|  | fs::Files::new("/images", format!("{}/images", public_folder_path)) | 
					
						
						|  | .show_files_listing(), | 
					
						
						|  | ) | 
					
						
						|  | .service(router::robots_data) | 
					
						
						|  | .service(router::index) | 
					
						
						|  | .service(server::routes::search::search) | 
					
						
						|  | .service(router::about) | 
					
						
						|  | .service(router::settings) | 
					
						
						|  | .default_service(web::route().to(router::not_found)) | 
					
						
						|  | }) | 
					
						
						|  | .workers(cloned_config_threads_opt as usize) | 
					
						
						|  |  | 
					
						
						|  | .listen(listener)? | 
					
						
						|  | .run(); | 
					
						
						|  | Ok(server) | 
					
						
						|  | } | 
					
						
						|  |  |