forked from ouch-org/ouch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
mod.rs
52 lines (41 loc) · 1.57 KB
/
mod.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//! CLI related functions, uses the clap argparsing definitions from `args.rs`.
mod args;
use std::{
io,
path::{Path, PathBuf},
vec::Vec,
};
use clap::Parser;
use fs_err as fs;
pub use self::args::{CliArgs, Subcommand};
use crate::{accessible::set_accessible, utils::FileVisibilityPolicy, QuestionPolicy};
impl CliArgs {
/// A helper method that calls `clap::Parser::parse`.
///
/// And:
/// 1. Make paths absolute.
/// 2. Checks the QuestionPolicy.
pub fn parse_args() -> crate::Result<(Self, QuestionPolicy, FileVisibilityPolicy)> {
let mut args = Self::parse();
set_accessible(args.accessible);
let (Subcommand::Compress { files, .. }
| Subcommand::Decompress { files, .. }
| Subcommand::List { archives: files, .. }) = &mut args.cmd;
*files = canonicalize_files(files)?;
let skip_questions_positively = match (args.yes, args.no) {
(false, false) => QuestionPolicy::Ask,
(true, false) => QuestionPolicy::AlwaysYes,
(false, true) => QuestionPolicy::AlwaysNo,
(true, true) => unreachable!(),
};
let file_visibility_policy = FileVisibilityPolicy::new()
.read_git_exclude(args.gitignore)
.read_ignore(args.gitignore)
.read_git_ignore(args.gitignore)
.read_hidden(args.hidden);
Ok((args, skip_questions_positively, file_visibility_policy))
}
}
fn canonicalize_files(files: &[impl AsRef<Path>]) -> io::Result<Vec<PathBuf>> {
files.iter().map(fs::canonicalize).collect()
}