pub mod blocks;
pub mod color;
pub mod date;
pub mod dereference;
pub mod display;
pub mod header;
pub mod hyperlink;
pub mod icons;
pub mod ignore_globs;
pub mod indicators;
pub mod layout;
pub mod permission;
pub mod recursion;
pub mod size;
pub mod sorting;
pub mod symlink_arrow;
pub mod symlinks;
pub mod total_size;
pub use blocks::Block;
pub use blocks::Blocks;
pub use color::Color;
pub use color::{ColorOption, ThemeOption};
pub use date::DateFlag;
pub use dereference::Dereference;
pub use display::Display;
pub use header::Header;
pub use hyperlink::HyperlinkOption;
pub use icons::IconOption;
pub use icons::IconSeparator;
pub use icons::IconTheme;
pub use icons::Icons;
pub use ignore_globs::IgnoreGlobs;
pub use indicators::Indicators;
pub use layout::Layout;
pub use permission::PermissionFlag;
pub use recursion::Recursion;
pub use size::SizeFlag;
pub use sorting::DirGrouping;
pub use sorting::SortColumn;
pub use sorting::SortOrder;
pub use sorting::Sorting;
pub use symlink_arrow::SymlinkArrow;
pub use symlinks::NoSymlink;
pub use total_size::TotalSize;
use crate::config_file::Config;
use clap::{ArgMatches, Error};
#[cfg(doc)]
use yaml_rust::Yaml;
#[derive(Clone, Debug, Default)]
pub struct Flags {
pub blocks: Blocks,
pub color: Color,
pub date: DateFlag,
pub dereference: Dereference,
pub display: Display,
pub display_indicators: Indicators,
pub icons: Icons,
pub ignore_globs: IgnoreGlobs,
pub layout: Layout,
pub no_symlink: NoSymlink,
pub recursion: Recursion,
pub size: SizeFlag,
pub permission: PermissionFlag,
pub sorting: Sorting,
pub total_size: TotalSize,
pub symlink_arrow: SymlinkArrow,
pub hyperlink: HyperlinkOption,
pub header: Header,
}
impl Flags {
pub fn configure_from(matches: &ArgMatches, config: &Config) -> Result<Self, Error> {
Ok(Self {
blocks: Blocks::configure_from(matches, config),
color: Color::configure_from(matches, config),
date: DateFlag::configure_from(matches, config),
dereference: Dereference::configure_from(matches, config),
display: Display::configure_from(matches, config),
layout: Layout::configure_from(matches, config),
size: SizeFlag::configure_from(matches, config),
permission: PermissionFlag::configure_from(matches, config),
display_indicators: Indicators::configure_from(matches, config),
icons: Icons::configure_from(matches, config),
ignore_globs: IgnoreGlobs::configure_from(matches, config)?,
no_symlink: NoSymlink::configure_from(matches, config),
recursion: Recursion::configure_from(matches, config)?,
sorting: Sorting::configure_from(matches, config),
total_size: TotalSize::configure_from(matches, config),
symlink_arrow: SymlinkArrow::configure_from(matches, config),
hyperlink: HyperlinkOption::configure_from(matches, config),
header: Header::configure_from(matches, config),
})
}
}
pub trait Configurable<T>
where
T: std::default::Default,
{
fn configure_from(matches: &ArgMatches, config: &Config) -> T {
if let Some(value) = Self::from_arg_matches(matches) {
return value;
}
if let Some(value) = Self::from_environment() {
return value;
}
if let Some(value) = Self::from_config(config) {
return value;
}
Default::default()
}
fn from_arg_matches(matches: &ArgMatches) -> Option<T>;
fn from_config(config: &Config) -> Option<T>;
fn from_environment() -> Option<T> {
None
}
}