From 562b62a0b638d2ca0731f83476a2e5f74757962a Mon Sep 17 00:00:00 2001 From: Sven-Hendrik Haase Date: Sat, 13 Jan 2024 06:11:59 +0100 Subject: Clean up default order function I removed the stringly typing as we already have enums for this that we can make use of. --- src/args.rs | 9 +++++---- src/config.rs | 26 ++++---------------------- src/listing.rs | 25 ++++++++++--------------- 3 files changed, 19 insertions(+), 41 deletions(-) (limited to 'src') diff --git a/src/args.rs b/src/args.rs index e400c8a..cc8b0f1 100644 --- a/src/args.rs +++ b/src/args.rs @@ -6,6 +6,7 @@ use http::header::{HeaderMap, HeaderName, HeaderValue}; use crate::auth; use crate::errors::ContextualError; +use crate::listing::{SortingMethod, SortingOrder}; use crate::renderer::ThemeSlug; #[derive(ValueEnum, Clone)] @@ -117,21 +118,21 @@ pub struct CliArgs { #[arg( short = 'S', long = "default-sorting-method", - default_value = "", + default_value = "name", ignore_case = true, env = "MINISERVE_DEFAULT_SORTING_METHOD" )] - pub default_sorting_method: String, + pub default_sorting_method: SortingMethod, /// Default sorting order for file list #[arg( short = 'O', long = "default-sorting-order", - default_value = "", + default_value = "desc", ignore_case = true, env = "MINISERVE_DEFAULT_SORTING_ORDER" )] - pub default_sorting_order: String, + pub default_sorting_order: SortingOrder, /// Default color scheme #[arg( diff --git a/src/config.rs b/src/config.rs index 491ac40..bfe916b 100644 --- a/src/config.rs +++ b/src/config.rs @@ -52,10 +52,10 @@ pub struct MiniserveConfig { pub show_hidden: bool, /// Default sorting method - pub default_sorting_method: Option, + pub default_sorting_method: SortingMethod, /// Default sorting order - pub default_sorting_order: Option, + pub default_sorting_order: SortingOrder, /// Route prefix; Either empty or prefixed with slash pub route_prefix: String, @@ -272,24 +272,6 @@ impl MiniserveConfig { .transpose()? .unwrap_or_default(); - let default_sorting_method: Option = match args - .default_sorting_method - .to_owned() - .parse::() - { - Ok(value) => Some(value), - Err(_) => None, - }; - - let default_sorting_order: Option = match args - .default_sorting_order - .to_owned() - .parse::() - { - Ok(value) => Some(value), - Err(_) => None, - }; - Ok(MiniserveConfig { verbose: args.verbose, path: args.path.unwrap_or_else(|| PathBuf::from(".")), @@ -299,8 +281,8 @@ impl MiniserveConfig { path_explicitly_chosen, no_symlinks: args.no_symlinks, show_hidden: args.hidden, - default_sorting_method, - default_sorting_order, + default_sorting_method: args.default_sorting_method, + default_sorting_order: args.default_sorting_order, route_prefix, favicon_route, css_route, diff --git a/src/listing.rs b/src/listing.rs index 40c5a77..3cd131e 100644 --- a/src/listing.rs +++ b/src/listing.rs @@ -5,6 +5,7 @@ use std::time::SystemTime; use actix_web::{dev::ServiceResponse, web::Query, HttpMessage, HttpRequest, HttpResponse}; use bytesize::ByteSize; +use clap::ValueEnum; use comrak::{markdown_to_html, ComrakOptions}; use percent_encoding::{percent_decode_str, utf8_percent_encode}; use regex::Regex; @@ -39,10 +40,11 @@ pub struct ListingQueryParameters { } /// Available sorting methods -#[derive(Deserialize, Clone, EnumString, Display, Copy)] +#[derive(Deserialize, Default, Clone, EnumString, Display, Copy, ValueEnum)] #[serde(rename_all = "snake_case")] #[strum(serialize_all = "snake_case")] pub enum SortingMethod { + #[default] /// Sort by name Name, @@ -54,17 +56,18 @@ pub enum SortingMethod { } /// Available sorting orders -#[derive(Deserialize, Clone, EnumString, Display, Copy)] +#[derive(Deserialize, Default, Clone, EnumString, Display, Copy, ValueEnum)] pub enum SortingOrder { /// Ascending order #[serde(alias = "asc")] #[strum(serialize = "asc")] - Ascending, + Asc, /// Descending order + #[default] #[serde(alias = "desc")] #[strum(serialize = "desc")] - Descending, + Desc, } #[derive(PartialEq, Eq)] @@ -223,7 +226,7 @@ pub fn directory_listing( res }; - let mut query_params = extract_query_parameters(req); + let query_params = extract_query_parameters(req); let mut entries: Vec = Vec::new(); let mut readme: Option<(String, String)> = None; @@ -299,15 +302,7 @@ pub fn directory_listing( } } - if query_params.sort.is_none() { - query_params.sort = conf.default_sorting_method - } - - if query_params.order.is_none() { - query_params.order = conf.default_sorting_order - } - - match query_params.sort.unwrap_or(SortingMethod::Name) { + match query_params.sort.unwrap_or(conf.default_sorting_method) { SortingMethod::Name => entries.sort_by(|e1, e2| { alphanumeric_sort::compare_str(e1.name.to_lowercase(), e2.name.to_lowercase()) }), @@ -327,7 +322,7 @@ pub fn directory_listing( }), }; - if let Some(SortingOrder::Ascending) = query_params.order { + if let SortingOrder::Asc = query_params.order.unwrap_or(conf.default_sorting_order) { entries.reverse() } -- cgit v1.2.3