fif/src/parameters.rs

106 lines
3.0 KiB
Rust
Raw Normal View History

//! [Clap] struct used to parse command line arguments.
2021-02-04 11:22:19 +00:00
use std::path::PathBuf;
use crate::extension_set::ExtensionSet;
use cfg_if::cfg_if;
2021-03-11 17:44:31 +00:00
use clap::{AppSettings, Clap};
use smartstring::{LazyCompact, SmartString};
cfg_if! {
if #[cfg(windows)] {
const DEFAULT_FORMAT: &str = "powershell";
} else {
const DEFAULT_FORMAT: &str = "script";
}
}
#[derive(Clap, PartialEq, Debug)]
pub enum OutputFormat {
2021-03-01 10:20:46 +00:00
/// A Bourne shell compatible script.
Script,
/// A PowerShell script.
PowerShell,
/// Also a PowerShell script, with different casing to allow for `fif -o powershell`.
Powershell,
2021-03-01 10:20:46 +00:00
/// Plain text.
Text,
}
2021-02-04 11:22:19 +00:00
// TODO: convert this to macro style?: https://docs.rs/clap/3.0.0-beta.2/clap/index.html#using-macros
2021-02-05 09:24:08 +00:00
#[derive(Clap, Debug)]
2021-03-01 10:20:46 +00:00
#[clap(
version = option_env!("CARGO_PKG_VERSION").unwrap_or("???"),
author = option_env!("CARGO_PKG_AUTHORS").unwrap_or("Lynnesbian"),
about = option_env!("CARGO_PKG_DESCRIPTION").unwrap_or("File Info Fixer"),
before_help = "Copyright © 2021 Lynnesbian under the GPL3 (or later) License.",
before_long_help = "Copyright © 2021 Lynnesbian\n\
This program is free software: you can redistribute it and/or modify \
it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 \
of the License, or (at your option) any later version.",
setting(AppSettings::ColoredHelp)
)]
2021-02-04 11:22:19 +00:00
pub struct Parameters {
/// Only examine files with these extensions (Comma-separated list)
2021-02-21 14:15:09 +00:00
#[clap(
short,
long,
use_delimiter = true,
require_delimiter = true,
required_unless_present = "ext-set"
)]
pub exts: Option<Vec<SmartString<LazyCompact>>>,
/// Use a preset list of extensions as the search filter
#[clap(short = 'E', long, arg_enum, required_unless_present = "exts")]
pub ext_set: Option<ExtensionSet>,
2021-02-04 11:22:19 +00:00
/// Don't skip hidden files and directories
2021-02-05 09:24:08 +00:00
#[clap(short, long)]
2021-02-04 11:22:19 +00:00
pub scan_hidden: bool,
/// Scan files without extensions
#[clap(short = 'S', long)]
pub scan_extensionless: bool,
2021-03-01 10:20:46 +00:00
/// Output format to use
#[clap(short, long, default_value = DEFAULT_FORMAT, arg_enum)]
pub output_format: OutputFormat,
2021-02-06 03:24:13 +00:00
/// Directory to process
// TODO: right now this can only take a single directory - should this be improved?
#[clap(name = "DIR", default_value = ".", parse(from_os_str))]
2021-02-04 11:22:19 +00:00
pub dirs: PathBuf,
}
/// Further options relating to scanning.
pub struct ScanOpts {
/// Whether hidden files and directories should be scanned.
pub hidden: bool,
/// Whether files without extensions should be scanned.
2021-03-11 17:44:31 +00:00
pub extensionless: bool,
}
impl Parameters {
pub fn extensions(&self) -> Vec<&str> {
if let Some(exts) = &self.exts {
// extensions supplied like "-e png,jpg,jpeg"
exts.iter().map(|s| s.as_str()).collect()
} else if let Some(exts) = &self.ext_set {
// extensions supplied like "-E images"
exts.extensions()
} else {
// neither -E nor -e was passed - this should be impossible
unreachable!()
}
}
2021-03-11 17:44:31 +00:00
pub const fn get_scan_opts(&self) -> ScanOpts {
ScanOpts {
hidden: self.scan_hidden,
extensionless: self.scan_extensionless,
}
}
}