Merge pull request #206 from sigmaSd/refactor
[ouch.git] / src / cli.rs
blob677471f554b6d19cf147d050a55558440e26f08e
1 //! CLI related functions, uses the clap argparsing definitions from `opts.rs`.
3 use std::{
4     io,
5     path::{Path, PathBuf},
6     vec::Vec,
7 };
9 use clap::Parser;
10 use fs_err as fs;
12 use crate::{Opts, QuestionPolicy, Subcommand};
14 impl Opts {
15     /// A helper method that calls `clap::Parser::parse`.
16     ///
17     /// And:
18     ///   1. Make paths absolute.
19     ///   2. Checks the QuestionPolicy.
20     pub fn parse_args() -> crate::Result<(Self, QuestionPolicy)> {
21         let mut opts = Self::parse();
23         let (Subcommand::Compress { files, .. }
24         | Subcommand::Decompress { files, .. }
25         | Subcommand::List { archives: files, .. }) = &mut opts.cmd;
26         *files = canonicalize_files(files)?;
28         let skip_questions_positively = if opts.yes {
29             QuestionPolicy::AlwaysYes
30         } else if opts.no {
31             QuestionPolicy::AlwaysNo
32         } else {
33             QuestionPolicy::Ask
34         };
36         Ok((opts, skip_questions_positively))
37     }
40 fn canonicalize_files(files: &[impl AsRef<Path>]) -> io::Result<Vec<PathBuf>> {
41     files.iter().map(fs::canonicalize).collect()