diff options
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/src/main.rs b/src/main.rs index 633ab84..080124d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use actix_web::{middleware, server, App}; +use actix_web::{fs, middleware, server, App}; use clap::crate_version; use simplelog::{Config, LevelFilter, TermLogger}; use std::io::{self, Write}; @@ -9,9 +9,22 @@ use yansi::{Color, Paint}; mod args; mod auth; -mod config; mod listing; +#[derive(Clone, Debug)] +pub struct MiniserveConfig { + pub verbose: bool, + pub path: std::path::PathBuf, + pub port: u16, + pub interfaces: Vec<IpAddr>, + pub auth: Option<auth::BasicAuthParams>, + pub path_explicitly_chosen: bool, + pub no_symlinks: bool, + pub random_route: Option<String>, + pub sort_method: listing::SortingMethods, + pub reverse_sort: bool, +} + fn main() { if cfg!(windows) && !Paint::enable_windows_ascii() { Paint::disable(); @@ -43,7 +56,7 @@ fn main() { App::with_state(inside_config.clone()) .middleware(auth::Auth) .middleware(middleware::Logger::default()) - .configure(config::configure_app) + .configure(configure_app) }) .bind( miniserve_config @@ -138,3 +151,41 @@ fn main() { let _ = sys.run(); } + +pub fn configure_app(app: App<MiniserveConfig>) -> App<MiniserveConfig> { + let s = { + let path = &app.state().path; + let no_symlinks = app.state().no_symlinks; + let random_route = app.state().random_route.clone(); + let sort_method = app.state().sort_method; + let reverse_sort = app.state().reverse_sort; + if path.is_file() { + None + } else { + Some( + fs::StaticFiles::new(path) + .expect("Couldn't create path") + .show_files_listing() + .files_listing_renderer(move |dir, req| { + listing::directory_listing( + dir, + req, + no_symlinks, + random_route.clone(), + sort_method, + reverse_sort, + ) + }), + ) + } + }; + + let random_route = app.state().random_route.clone().unwrap_or_default(); + let full_route = format!("/{}", random_route); + + if let Some(s) = s { + app.handler(&full_route, s) + } else { + app.resource(&full_route, |r| r.f(listing::file_handler)) + } +} |