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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
macro_rules! commands {
($($cmd:ident),* $(,)*) => {
$(
mod $cmd;
pub use self::$cmd::*;
)*
}
}
macro_rules! command {
( $(#[$attr:meta])* ) => {
#[derive(Command)]
$(#[$attr])*
struct _DummyCommand;
}
}
#[macro_export]
macro_rules! args {
( $($arg:tt)+ ) => {{
#[allow(unused_imports)]
use $crate::{ToArg, Term};
#[allow(unused_imports)]
use $crate::commands::Args;
let mut args = Args::new();
{
let term = args.mut_term();
__process_args!(term, $($arg)+);
}
args
}};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __process_args {
( $term:ident, ) => { };
( $term:ident, $(,)* { $($key:ident: $val:tt),* $(,)* } $(,)* ) => {{
$(
let key = stringify!($key);
let mut val = Term::new();
__process_args!(val, $val);
let temp_pair = Args::create_term_pair(key, val);
$term.mut_optargs().push(temp_pair);
)*
}};
( $term:ident, $(,)* { $($key:ident: $val:tt),* $(,)* } $($tail:tt)* ) => {{
let mut arg = Term::new();
$(
let key = stringify!($key);
let mut val = Term::new();
__process_args!(val, $val);
let temp_pair = Args::create_term_pair(key, val);
arg.mut_optargs().push(temp_pair);
)*
$term.mut_args().push(arg);
__process_args!($term, $($tail)*);
}};
( $term:ident, $(,)* [ $($val:tt),* $(,)* ] $($tail:tt)* ) => {{
let mut arg = Term::new();
$(
let mut val = Term::new();
__process_args!(val, $val);
arg.mut_args().push(val);
)*
$term.mut_args().push(arg);
__process_args!($term, $($tail)*);
}};
( $term:ident, $(,)* | $($arg:ident),* $(,)* | { $($body:tt)+ } $($tail:tt)* ) => {{
__process_args!($term, $($tail)*);
}};
( $term:ident, $(,)* | $($arg:ident),* $(,)* | $body:expr, $($tail:tt)+ ) => {{
__process_args!($term, $($tail)+);
}};
( $term:ident, $(,)* | $($arg:ident),* $(,)* | $body:expr $(,)* ) => {{
}};
( $term:ident, $(,)* $arg:expr, $($tail:tt)+ ) => {{
$term.mut_args().push($arg.to_arg());
__process_args!($term, $($tail)+);
}};
( $term:ident, $(,)* $arg:expr $(,)* ) => {{
$term.mut_args().push($arg.to_arg());
}};
}