lla 0.1.6

A lightweight ls replacement
mod args;
mod error;
mod filter;
mod format;
mod ls;
mod sort;

use crate::filter::NoFilter;
use args::{parse_args, FilterBy, SortBy};
use filter::FileFilter;
use format::{DefaultFileFormatter, FileFormatter, TreeFileFormatter};
use ls::FileLister;
use sort::FileSorter;

fn main() {
    let options = parse_args();

    let lister: Box<dyn FileLister>;
    if options.recursive {
        lister = Box::new(ls::TreeLister::new());
    } else {
        match options.long_format {
            true => lister = Box::new(ls::LongLister::new()),
            false => lister = Box::new(ls::BasicLister::new()),
        }
    }

    let sorter: Box<dyn FileSorter> = match options.sort_by {
        SortBy::Name => Box::new(sort::AlphabeticalSorter::new()),
        SortBy::Size => Box::new(sort::SizeSorter::new()),
        SortBy::Date => Box::new(sort::DateSorter::new()),
    };

    let filter: Box<dyn FileFilter> = match options.filter {
        Some(FilterBy::Extension(ext)) => Box::new(filter::ExtensionFilter::new(&ext)),
        Some(FilterBy::Pattern(pattern)) => Box::new(filter::PatternFilter::new(&pattern)),
        None => Box::new(NoFilter::new()),
    };

    let result = lister.list_files(&options.directory, Some(options.recursive), options.depth);
    match result {
        Err(e) => eprintln!("{}", e),
        Ok(files) => {
            let sorted_files = sorter.sort_files(files);
            let filtered_files = filter.filter_files(sorted_files);
            let formatter: Box<dyn FileFormatter> = match options.recursive {
                true => Box::new(TreeFileFormatter::new()),
                false => Box::new(DefaultFileFormatter::new()),
            };
            formatter.display_files(
                &filtered_files,
                Some(options.long_format),
                Some(options.git),
            );
        }
    }
}