diff options
Diffstat (limited to 'src/listing.rs')
-rw-r--r-- | src/listing.rs | 43 |
1 files changed, 25 insertions, 18 deletions
diff --git a/src/listing.rs b/src/listing.rs index a030feb..cadbb99 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -5,7 +5,7 @@ use htmlescape::encode_minimal as escape_html_entity; use percent_encoding::{utf8_percent_encode, DEFAULT_ENCODE_SET}; use serde::Deserialize; use std::io; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::time::SystemTime; use strum_macros::{Display, EnumString}; @@ -16,15 +16,16 @@ use crate::themes; /// Query parameters #[derive(Deserialize)] -struct QueryParameters { - sort: Option<SortingMethod>, - order: Option<SortingOrder>, +pub struct QueryParameters { + pub path: Option<PathBuf>, + pub sort: Option<SortingMethod>, + pub order: Option<SortingOrder>, + pub theme: Option<themes::ColorScheme>, download: Option<archive::CompressionMethod>, - theme: Option<themes::ColorScheme>, } /// Available sorting methods -#[derive(Deserialize, Clone, EnumString, Display)] +#[derive(Deserialize, Clone, EnumString, Display, Copy)] #[serde(rename_all = "snake_case")] #[strum(serialize_all = "snake_case")] pub enum SortingMethod { @@ -39,7 +40,7 @@ pub enum SortingMethod { } /// Available sorting orders -#[derive(Deserialize, Clone, EnumString, Display)] +#[derive(Deserialize, Clone, EnumString, Display, Copy)] pub enum SortingOrder { /// Ascending order #[serde(alias = "asc")] @@ -144,12 +145,7 @@ pub fn directory_listing<S>( let (sort_method, sort_order, download, color_scheme) = if let Ok(query) = Query::<QueryParameters>::extract(req) { - ( - query.sort.clone(), - query.order.clone(), - query.download.clone(), - query.theme.clone(), - ) + (query.sort, query.order, query.download.clone(), query.theme) } else { (None, None, None, None) }; @@ -158,7 +154,7 @@ pub fn directory_listing<S>( for entry in dir.path.read_dir()? { if dir.is_visible(&entry) { - let entry = entry.unwrap(); + let entry = entry?; let p = match entry.path().strip_prefix(&dir.path) { Ok(p) => base.join(p), Err(_) => continue, @@ -210,7 +206,7 @@ pub fn directory_listing<S>( } } - if let Some(sorting_method) = &sort_method { + if let Some(sorting_method) = sort_method { match sorting_method { SortingMethod::Name => entries .sort_by(|e1, e2| alphanumeric_sort::compare_str(e1.name.clone(), e2.name.clone())), @@ -234,13 +230,13 @@ pub fn directory_listing<S>( entries.sort_by(|e1, e2| alphanumeric_sort::compare_str(e1.name.clone(), e2.name.clone())) } - if let Some(sorting_order) = &sort_order { + if let Some(sorting_order) = sort_order { if let SortingOrder::Descending = sorting_order { entries.reverse() } } - let color_scheme = color_scheme.unwrap_or_else(|| default_color_scheme.clone()); + let color_scheme = color_scheme.unwrap_or_else(|| default_color_scheme); if let Some(compression_method) = &download { log::info!( @@ -266,7 +262,18 @@ pub fn directory_listing<S>( errors::log_error_chain(err.to_string()); Ok(HttpResponse::Ok() .status(http::StatusCode::INTERNAL_SERVER_ERROR) - .body(renderer::render_error(&err.to_string(), serve_path).into_string())) + .body( + renderer::render_error( + &err.to_string(), + serve_path, + sort_method, + sort_order, + color_scheme, + default_color_scheme, + false, + ) + .into_string(), + )) } } } else { |