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#[derive(Debug, Clone, Default, PartialEq)]
29pub struct Argv {
30 pub commands: Vec<String>,
32 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}