1 //! CLI related functions, uses the clap argparsing definitions from `args.rs`.
14 pub use self::args::{CliArgs, Subcommand};
15 use crate::{accessible::set_accessible, utils::FileVisibilityPolicy, QuestionPolicy};
18 /// A helper method that calls `clap::Parser::parse`.
21 /// 1. Make paths absolute.
22 /// 2. Checks the QuestionPolicy.
23 pub fn parse_and_validate_args() -> crate::Result<(Self, QuestionPolicy, FileVisibilityPolicy)> {
24 let mut args = Self::parse();
26 set_accessible(args.accessible);
28 let (Subcommand::Compress { files, .. }
29 | Subcommand::Decompress { files, .. }
30 | Subcommand::List { archives: files, .. }) = &mut args.cmd;
31 *files = canonicalize_files(files)?;
33 let skip_questions_positively = match (args.yes, args.no) {
34 (false, false) => QuestionPolicy::Ask,
35 (true, false) => QuestionPolicy::AlwaysYes,
36 (false, true) => QuestionPolicy::AlwaysNo,
37 (true, true) => unreachable!(),
40 let file_visibility_policy = FileVisibilityPolicy::new()
41 .read_git_exclude(args.gitignore)
42 .read_ignore(args.gitignore)
43 .read_git_ignore(args.gitignore)
44 .read_hidden(args.hidden);
46 Ok((args, skip_questions_positively, file_visibility_policy))
50 fn canonicalize_files(files: &[impl AsRef<Path>]) -> io::Result<Vec<PathBuf>> {
51 files.iter().map(fs::canonicalize).collect()