1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
use std::path::PathBuf; use std::sync::Arc; use actix_web::{App, HttpResponse, HttpServer, web}; use actix_web::body::Body; use actix_web::middleware::Logger; use actix_web::web::Bytes; use crate::data::packed::PackedReader; struct TestServer { default_results: Bytes, packed_documents: Vec<Bytes>, packed_popular_terms: Vec<Bytes>, packed_normal_terms: Vec<Bytes>, } async fn handle_get_default_results(config: web::Data<Arc<TestServer>>) -> HttpResponse { HttpResponse::Ok().body(Body::Bytes(config.default_results.slice(..))) } async fn handle_get_documents_package(config: web::Data<Arc<TestServer>>, path: web::Path<(usize, )>) -> HttpResponse { match config.packed_documents.get(path.0) { None => HttpResponse::NotFound().finish(), Some(package) => HttpResponse::Ok().body(Body::Bytes(package.slice(..))), } } async fn handle_get_popular_terms_package(config: web::Data<Arc<TestServer>>, path: web::Path<(usize, )>) -> HttpResponse { match config.packed_popular_terms.get(path.0) { None => HttpResponse::NotFound().finish(), Some(package) => HttpResponse::Ok().body(Body::Bytes(package.slice(..))), } } async fn handle_get_normal_terms_package(config: web::Data<Arc<TestServer>>, path: web::Path<(usize, )>) -> HttpResponse { match config.packed_normal_terms.get(path.0) { None => HttpResponse::NotFound().finish(), Some(package) => HttpResponse::Ok().body(Body::Bytes(package.slice(..))), } } #[actix_rt::main] pub async fn start_server(output_dir: PathBuf, port: usize, default_results: String) -> () { std::env::set_var("RUST_LOG", "actix_web=debug"); env_logger::init(); println!("Reading packed documents packages..."); let packed_documents = PackedReader::new(&output_dir, "documents") .map(|package_data| Bytes::copy_from_slice(&package_data)) .collect::<Vec<Bytes>>(); println!("Reading packed postings list entries for popular terms packages..."); let packed_popular_terms = PackedReader::new(&output_dir, "popular_terms") .map(|package_data| Bytes::copy_from_slice(&package_data)) .collect::<Vec<Bytes>>(); println!("Reading packed postings list entries for normal terms packages..."); let packed_normal_terms = PackedReader::new(&output_dir, "normal_terms") .map(|package_data| Bytes::copy_from_slice(&package_data)) .collect::<Vec<Bytes>>(); let config = Arc::new(TestServer { default_results: Bytes::copy_from_slice(default_results.as_bytes()), packed_documents, packed_popular_terms, packed_normal_terms, }); println!("Starting server..."); HttpServer::new(move || { App::new() .wrap(Logger::default()) .data(config.clone()) .route("/package/default", web::get().to(handle_get_default_results)) .route("/package/doc/{doc_id}", web::get().to(handle_get_documents_package)) .route("/package/popular_terms/{doc_id}", web::get().to(handle_get_popular_terms_package)) .route("/package/normal_terms/{doc_id}", web::get().to(handle_get_normal_terms_package)) }) .bind(format!("127.0.0.1:{}", port).as_str()).expect("binding to port") .run().await.expect("run server"); }