clap/args/
any_arg.rs

1// Std
2use std::{
3    ffi::{OsStr, OsString},
4    fmt as std_fmt,
5    rc::Rc,
6};
7
8// Internal
9use crate::{
10    args::settings::ArgSettings,
11    map::{self, VecMap},
12    INTERNAL_ERROR_MSG,
13};
14
15#[doc(hidden)]
16pub trait AnyArg<'n, 'e>: std_fmt::Display {
17    fn name(&self) -> &'n str;
18    fn overrides(&self) -> Option<&[&'e str]>;
19    fn aliases(&self) -> Option<Vec<&'e str>>;
20    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]>;
21    fn blacklist(&self) -> Option<&[&'e str]>;
22    fn required_unless(&self) -> Option<&[&'e str]>;
23    fn is_set(&self, setting: ArgSettings) -> bool;
24    fn set(&mut self, setting: ArgSettings);
25    fn has_switch(&self) -> bool;
26    fn max_vals(&self) -> Option<u64>;
27    fn min_vals(&self) -> Option<u64>;
28    fn num_vals(&self) -> Option<u64>;
29    fn possible_vals(&self) -> Option<&[&'e str]>;
30    #[cfg_attr(feature = "cargo-clippy", allow(clippy::type_complexity))]
31    fn validator(&self) -> Option<&Rc<Fn(String) -> Result<(), String>>>;
32    #[cfg_attr(feature = "cargo-clippy", allow(clippy::type_complexity))]
33    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> Result<(), OsString>>>;
34    fn short(&self) -> Option<char>;
35    fn long(&self) -> Option<&'e str>;
36    fn val_delim(&self) -> Option<char>;
37    fn takes_value(&self) -> bool;
38    fn val_names(&self) -> Option<&VecMap<&'e str>>;
39    fn help(&self) -> Option<&'e str>;
40    fn long_help(&self) -> Option<&'e str>;
41    fn default_val(&self) -> Option<&'e OsStr>;
42    fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>>;
43    fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)>;
44    fn longest_filter(&self) -> bool;
45    fn val_terminator(&self) -> Option<&'e str>;
46}
47
48pub trait DispOrder {
49    fn disp_ord(&self) -> usize;
50}
51
52impl<'n, 'e, 'z, T: ?Sized> AnyArg<'n, 'e> for &'z T
53where
54    T: AnyArg<'n, 'e> + 'z,
55{
56    fn name(&self) -> &'n str {
57        (*self).name()
58    }
59    fn overrides(&self) -> Option<&[&'e str]> {
60        (*self).overrides()
61    }
62    fn aliases(&self) -> Option<Vec<&'e str>> {
63        (*self).aliases()
64    }
65    fn requires(&self) -> Option<&[(Option<&'e str>, &'n str)]> {
66        (*self).requires()
67    }
68    fn blacklist(&self) -> Option<&[&'e str]> {
69        (*self).blacklist()
70    }
71    fn required_unless(&self) -> Option<&[&'e str]> {
72        (*self).required_unless()
73    }
74    fn is_set(&self, a: ArgSettings) -> bool {
75        (*self).is_set(a)
76    }
77    fn set(&mut self, _: ArgSettings) {
78        panic!("{}", INTERNAL_ERROR_MSG)
79    }
80    fn has_switch(&self) -> bool {
81        (*self).has_switch()
82    }
83    fn max_vals(&self) -> Option<u64> {
84        (*self).max_vals()
85    }
86    fn min_vals(&self) -> Option<u64> {
87        (*self).min_vals()
88    }
89    fn num_vals(&self) -> Option<u64> {
90        (*self).num_vals()
91    }
92    fn possible_vals(&self) -> Option<&[&'e str]> {
93        (*self).possible_vals()
94    }
95    #[cfg_attr(feature = "cargo-clippy", allow(clippy::type_complexity))]
96    fn validator(&self) -> Option<&Rc<Fn(String) -> Result<(), String>>> {
97        (*self).validator()
98    }
99    #[cfg_attr(feature = "cargo-clippy", allow(clippy::type_complexity))]
100    fn validator_os(&self) -> Option<&Rc<Fn(&OsStr) -> Result<(), OsString>>> {
101        (*self).validator_os()
102    }
103    fn short(&self) -> Option<char> {
104        (*self).short()
105    }
106    fn long(&self) -> Option<&'e str> {
107        (*self).long()
108    }
109    fn val_delim(&self) -> Option<char> {
110        (*self).val_delim()
111    }
112    fn takes_value(&self) -> bool {
113        (*self).takes_value()
114    }
115    fn val_names(&self) -> Option<&VecMap<&'e str>> {
116        (*self).val_names()
117    }
118    fn help(&self) -> Option<&'e str> {
119        (*self).help()
120    }
121    fn long_help(&self) -> Option<&'e str> {
122        (*self).long_help()
123    }
124    fn default_val(&self) -> Option<&'e OsStr> {
125        (*self).default_val()
126    }
127    fn default_vals_ifs(&self) -> Option<map::Values<(&'n str, Option<&'e OsStr>, &'e OsStr)>> {
128        (*self).default_vals_ifs()
129    }
130    fn env<'s>(&'s self) -> Option<(&'n OsStr, Option<&'s OsString>)> {
131        (*self).env()
132    }
133    fn longest_filter(&self) -> bool {
134        (*self).longest_filter()
135    }
136    fn val_terminator(&self) -> Option<&'e str> {
137        (*self).val_terminator()
138    }
139}