use {
super::Sort,
crate::{
cli::clap_args,
conf::Conf,
display::{Cols, DEFAULT_COLS},
errors::ConfError,
pattern::*,
},
clap::ArgMatches,
std::convert::TryFrom,
};
#[derive(Debug, Clone)]
pub struct TreeOptions {
pub show_selection_mark: bool, pub show_hidden: bool, pub only_folders: bool, pub show_counts: bool, pub show_dates: bool, pub show_sizes: bool, pub show_git_file_info: bool,
pub show_device_id: bool,
pub show_root_fs: bool, pub trim_root: bool, pub show_permissions: bool, pub respect_git_ignore: bool, pub filter_by_git_status: bool, pub pattern: InputPattern, pub date_time_format: &'static str,
pub sort: Sort,
pub cols_order: Cols, }
impl TreeOptions {
pub fn without_pattern(&self) -> Self {
TreeOptions {
show_selection_mark: self.show_selection_mark,
show_hidden: self.show_hidden,
only_folders: self.only_folders,
show_counts: self.show_counts,
show_dates: self.show_dates,
show_sizes: self.show_sizes,
show_permissions: self.show_permissions,
respect_git_ignore: self.respect_git_ignore,
filter_by_git_status: self.filter_by_git_status,
show_git_file_info: self.show_git_file_info,
show_device_id: self.show_device_id,
show_root_fs: self.show_root_fs,
trim_root: self.trim_root,
pattern: InputPattern::none(),
date_time_format: self.date_time_format,
sort: self.sort,
cols_order: self.cols_order,
}
}
pub fn needs_counts(&self) -> bool {
self.show_counts || self.sort == Sort::Count
}
pub fn needs_dates(&self) -> bool {
self.show_dates || self.sort == Sort::Date
}
pub fn needs_sizes(&self) -> bool {
self.show_sizes || self.sort == Sort::Size
}
pub fn needs_sum(&self) -> bool {
self.needs_counts() || self.needs_dates() || self.needs_sizes()
}
pub fn set_date_time_format(&mut self, format: String) {
self.date_time_format = Box::leak(format.into_boxed_str());
}
pub fn apply_config(&mut self, config: &Conf) -> Result<(), ConfError> {
if let Some(default_flags) = &config.default_flags {
let clap_app = clap_args::clap_app().setting(clap::AppSettings::NoBinaryName);
let flags_args = format!("-{}", default_flags);
let conf_matches = clap_app.get_matches_from(vec![&flags_args]);
self.apply_launch_args(&conf_matches);
}
if let Some(b) = &config.show_selection_mark {
self.show_selection_mark = *b;
}
if let Some(format) = &config.date_time_format {
self.set_date_time_format(format.clone());
}
self.cols_order = config
.cols_order
.as_ref()
.map(Cols::try_from)
.transpose()?
.unwrap_or(DEFAULT_COLS);
Ok(())
}
pub fn apply_launch_args(&mut self, cli_args: &ArgMatches<'_>) {
if cli_args.is_present("sizes") {
self.show_sizes = true;
self.show_root_fs = true;
} else if cli_args.is_present("no-sizes") {
self.show_sizes = false;
}
if cli_args.is_present("whale-spotting") {
self.show_hidden = true;
self.respect_git_ignore = false;
self.sort = Sort::Size;
self.show_sizes = true;
self.show_root_fs = true;
}
if cli_args.is_present("only-folders") {
self.only_folders = true;
} else if cli_args.is_present("no-only-folders") {
self.only_folders = false;
}
if cli_args.is_present("git-status") {
self.filter_by_git_status = true;
self.show_hidden = true;
}
if cli_args.is_present("hidden") {
self.show_hidden = true;
} else if cli_args.is_present("no-hidden") {
self.show_hidden = false;
}
if cli_args.is_present("dates") {
self.show_dates = true;
} else if cli_args.is_present("no-dates") {
self.show_dates = false;
}
if cli_args.is_present("permissions") {
self.show_permissions = true;
} else if cli_args.is_present("no-permissions") {
self.show_permissions = false;
}
if cli_args.is_present("show-root-fs") {
self.show_root_fs = true;
}
if cli_args.is_present("show-gitignored") {
self.respect_git_ignore = false;
} else if cli_args.is_present("no-show-gitignored") {
self.respect_git_ignore = true;
}
if cli_args.is_present("show-git-info") {
self.show_git_file_info = true;
} else if cli_args.is_present("no-show-git-info") {
self.show_git_file_info = false;
}
if cli_args.is_present("sort-by-count") {
self.sort = Sort::Count;
self.show_counts = true;
}
if cli_args.is_present("sort-by-date") {
self.sort = Sort::Date;
self.show_dates = true;
}
if cli_args.is_present("sort-by-size") {
self.sort = Sort::Size;
self.show_sizes = true;
}
if cli_args.is_present("no-sort") {
self.sort = Sort::None;
}
if cli_args.is_present("trim-root") {
self.trim_root = true;
} else if cli_args.is_present("no-trim-root") {
self.trim_root = false;
}
}
}
impl Default for TreeOptions {
fn default() -> Self {
Self {
show_selection_mark: false,
show_hidden: false,
only_folders: false,
show_counts: false,
show_dates: false,
show_sizes: false,
show_git_file_info: false,
show_device_id: false,
show_root_fs: false,
trim_root: false,
show_permissions: false,
respect_git_ignore: true,
filter_by_git_status: false,
pattern: InputPattern::none(),
date_time_format: "%Y/%m/%d %R",
sort: Sort::None,
cols_order: DEFAULT_COLS,
}
}
}