aboutsummaryrefslogtreecommitdiffstats
path: root/src/listing.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/listing.rs')
-rw-r--r--src/listing.rs43
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 {