clier_parser/
lib.rs

1#![doc = include_str!("../README.md")]
2mod commands_argv;
3mod flags;
4mod utils;
5
6use commands_argv::transform_command_argv;
7use flags::transform_flags_argv;
8use std::collections::HashMap;
9use std::env;
10use utils::remove_dashdash;
11
12/// Example structure:
13/// ```markdown
14/// Argv {
15///   commands: Vec<String> [
16///      "command",
17///      "subcommand",
18///    ],
19///    flags: HashMap<String, String> {
20///      "test": "value",
21///      "production": "false",
22///      "help": "true",
23///      "try-me": "false",
24///    }
25///    after_double_dash: ""
26/// }
27/// ```
28#[derive(Debug, Clone, Default, PartialEq)]
29pub struct Argv {
30  /// Commands from argv
31  pub commands: Vec<String>,
32  /// Flags from argv in a key-value format
33  pub flags: HashMap<String, String>,
34  after_double_dash: String
35}
36
37impl Argv {
38  pub fn parse() -> Self {
39    Argv::from(&env::args().collect::<Vec<String>>()[1..])
40  }
41
42  pub fn after_dashes(&self) -> &str {
43    self.after_double_dash.as_str()
44  }
45  fn transform_vargs(args: &[String]) -> Argv {
46    let (args, after_double_dash) = remove_dashdash(args);
47    let flags = transform_flags_argv(&args);
48    let commands = transform_command_argv(&args);
49
50    Argv { commands, flags, after_double_dash }
51  }
52}
53
54impl From<&str> for Argv {
55  fn from(args: &str) -> Self {
56    let args = args.split(' ').map(|value| value.to_string()).collect::<Vec<String>>();
57    Argv::transform_vargs(&args)
58  }
59}
60impl From<String> for Argv {
61  fn from(args: String) -> Self {
62    let args = args.split(' ').map(|value| value.to_string()).collect::<Vec<String>>();
63    Argv::transform_vargs(&args)
64  }
65}
66impl From<&[String]> for Argv {
67  fn from(args: &[String]) -> Self {
68    let args = args.iter().map(|value| value.to_string()).collect::<Vec<String>>();
69    Argv::transform_vargs(&args)
70  }
71}