chore: update CHANGELOG.md
[ouch.git] / src / cli / mod.rs
blobcfcd67d0e8ec8034053d2eea185d2aae9892ed32
1 //! CLI related functions, uses the clap argparsing definitions from `args.rs`.
3 mod args;
5 use std::{
6     io,
7     path::{Path, PathBuf},
8     vec::Vec,
9 };
11 use clap::Parser;
12 use fs_err as fs;
14 pub use self::args::{CliArgs, Subcommand};
15 use crate::{accessible::set_accessible, utils::FileVisibilityPolicy, QuestionPolicy};
17 impl CliArgs {
18     /// A helper method that calls `clap::Parser::parse`.
19     ///
20     /// And:
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!(),
38         };
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))
47     }
50 fn canonicalize_files(files: &[impl AsRef<Path>]) -> io::Result<Vec<PathBuf>> {
51     files.iter().map(fs::canonicalize).collect()