1 #![allow(deprecated)]
2 
3 // Std
4 use std::ops::BitOr;
5 #[cfg(feature = "yaml")]
6 use std::str::FromStr;
7 
8 // Third party
9 use bitflags::bitflags;
10 
11 #[allow(unused)]
12 use crate::Arg;
13 
14 #[doc(hidden)]
15 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
16 pub struct ArgFlags(Flags);
17 
18 impl Default for ArgFlags {
default() -> Self19     fn default() -> Self {
20         Self::empty()
21     }
22 }
23 
24 /// Various settings that apply to arguments and may be set, unset, and checked via getter/setter
25 /// methods [`Arg::setting`], [`Arg::unset_setting`], and [`Arg::is_set`]. This is what the
26 /// [`Arg`] methods which accept a `bool` use internally.
27 ///
28 /// [`Arg`]: crate::Arg
29 /// [`Arg::setting`]: crate::Arg::setting()
30 /// [`Arg::unset_setting`]: crate::Arg::unset_setting()
31 /// [`Arg::is_set`]: crate::Arg::is_set()
32 #[derive(Debug, PartialEq, Copy, Clone)]
33 #[non_exhaustive]
34 pub enum ArgSettings {
35     /// Deprecated, replaced with [`Arg::required`] and [`Arg::is_required_set`]
36     ///
37     /// Derive: replace `#[clap(setting = Required)]` with `#[clap(required = true)]`
38     ///
39     /// Builder: replace `arg.setting(Required)` with `arg.required(true)`
40     #[cfg_attr(
41         feature = "deprecated",
42         deprecated(
43             since = "3.1.0",
44             note = "Replaced with `Arg::required` and `Arg::is_required_set`
45 
46 Derive: replace `#[clap(setting = Required)]` with `#[clap(required = true)]`
47 
48 Builder: replace `arg.setting(Required)` with `arg.required(true)`
49 "
50         )
51     )]
52     Required,
53     /// Deprecated, replaced with [`Arg::multiple_values`] and [`Arg::is_multiple_values_set`]
54     ///
55     /// Derive: replace `#[clap(setting = MultipleValues)]` with `#[clap(multiple_values = true)]`
56     ///
57     /// Builder: replace `arg.setting(MultipleValues)` with `arg.multiple_values(true)`
58     #[cfg_attr(
59         feature = "deprecated",
60         deprecated(
61             since = "3.1.0",
62             note = "Replaced with `Arg::multiple_values` and `Arg::`is_multiple_values_set`
63 
64 Derive: replace `#[clap(setting = MultipleValues)]` with `#[clap(multiple_values = true)]`
65 
66 Builder: replace `arg.setting(MultipleValues)` with `arg.multiple_values(true)`
67 "
68         )
69     )]
70     MultipleValues,
71     /// Deprecated, replaced with [`Arg::action`] ([Issue #3772](https://github.com/clap-rs/clap/issues/3772))
72     #[cfg_attr(
73         feature = "deprecated",
74         deprecated(
75             since = "3.1.0",
76             note = "Replaced with `Arg::action` (Issue #3772)
77 
78 Builder: replace `arg.setting(MultipleOccurrences)` with `arg.action(ArgAction::Append)` when taking a value and `arg.action(ArgAction::Count)` with `matches.get_count` when not
79 "
80         )
81     )]
82     MultipleOccurrences,
83     /// Deprecated, see [`ArgSettings::MultipleOccurrences`] (most likely what you want) and
84     /// [`ArgSettings::MultipleValues`]
85     ///
86     /// Derive: replace `#[clap(setting = Multiple)]` with `#[clap(multiple_values = true, multiple_occurrences = true)]`
87     ///
88     /// Builder: replace `arg.setting(Multiple)` with `arg.multiple_values(true).multiple_occurrences(true)`
89     #[cfg_attr(
90         feature = "deprecated",
91         deprecated(
92             since = "3.0.0",
93             note = "Split into `Arg::multiple_occurrences` (most likely what you want)  and `Arg::multiple_values`
94 
95 Derive: replace `#[clap(setting = Multiple)]` with `#[clap(multiple_values = true, multiple_occurrences = true)]`
96 
97 Builder: replace `arg.setting(Multiple)` with `arg.multiple_values(true).multiple_occurrences(true)`
98 "
99         )
100     )]
101     #[doc(hidden)]
102     Multiple,
103     /// Deprecated, replaced with [`Arg::value_parser(NonEmptyStringValueParser::new())`]
104     ///
105     /// Derive: replace `#[clap(setting = ForbidEmptyValues)]` with `#[clap(value_parser = NonEmptyStringValueParser::new())]`
106     ///
107     /// Builder: replace `arg.setting(Multiple)` with `arg.value_parser(NonEmptyStringValueParser::new())`
108     #[cfg_attr(
109         feature = "deprecated",
110         deprecated(
111             since = "3.1.0",
112             note = "Replaced with `Arg::value_parser(NonEmptyStringValueParser::new())`
113 
114 Derive: replace `#[clap(setting = ForbidEmptyValues)]` with `#[clap(value_parser = NonEmptyStringValueParser::new())]`
115 
116 Builder: replace `arg.setting(Multiple)` with `arg.value_parser(NonEmptyStringValueParser::new())`
117 "
118         )
119     )]
120     ForbidEmptyValues,
121     /// Deprecated, replaced with [`Arg::global`] and [`Arg::is_global_set`]
122     ///
123     /// Derive: replace `#[clap(setting = Global)]` with `#[clap(global = true)]`
124     ///
125     /// Builder: replace `arg.setting(Global)` with `arg.global(true)`
126     #[cfg_attr(
127         feature = "deprecated",
128         deprecated(
129             since = "3.1.0",
130             note = "Replaced with `Arg::global` and `Arg::is_global_set`
131 
132 Derive: replace `#[clap(setting = Global)]` with `#[clap(global = true)]`
133 
134 Builder: replace `arg.setting(Global)` with `arg.global(true)`
135 "
136         )
137     )]
138     Global,
139     /// Deprecated, replaced with [`Arg::hide`] and [`Arg::is_hide_set`]
140     ///
141     /// Derive: replace `#[clap(setting = Hidden)]` with `#[clap(hide = true)]`
142     ///
143     /// Builder: replace `arg.setting(Hidden)` with `arg.hide(true)`
144     #[cfg_attr(
145         feature = "deprecated",
146         deprecated(
147             since = "3.1.0",
148             note = "Replaced with `Arg::hide` and `Arg::is_hide_set`
149 
150 Derive: replace `#[clap(setting = Hidden)]` with `#[clap(hide = true)]`
151 
152 Builder: replace `arg.setting(Hidden)` with `arg.hide(true)`
153 "
154         )
155     )]
156     Hidden,
157     /// Deprecated, replaced with [`Arg::takes_value`] and [`Arg::is_takes_value_set`]
158     ///
159     /// Derive: this setting shouldn't be needed
160     ///
161     /// Builder: replace `arg.setting(TakesValue)` with `arg.takes_value(true)`
162     #[cfg_attr(
163         feature = "deprecated",
164         deprecated(
165             since = "3.1.0",
166             note = "Replaced with `Arg::takes_value` and `Arg::is_takes_value_set`
167 
168 Derive: this setting shouldn't be needed
169 
170 Builder: replace `arg.setting(TakesValue)` with `arg.takes_value(true)`
171 "
172         )
173     )]
174     TakesValue,
175     /// Deprecated, replaced with [`Arg::use_value_delimiter`] and
176     /// [`Arg::is_use_value_delimiter_set`]
177     ///
178     /// Derive: replace `#[clap(setting = UseValueDelimiter)]` with `#[clap(use_value_delimiter = true)]`
179     ///
180     /// Builder: replace `arg.setting(UseValueDelimiter)` with `arg.use_value_delimiter(true)`
181     #[cfg_attr(
182         feature = "deprecated",
183         deprecated(
184             since = "3.1.0",
185             note = "Replaced with `Arg::use_value_delimiter` and `Arg::is_use_value_delimiter_set`
186 
187 Derive: replace `#[clap(setting = UseValueDelimiter)]` with `#[clap(use_value_delimiter = true)]`
188 
189 Builder: replace `arg.setting(UseValueDelimiter)` with `arg.use_value_delimiter(true)`
190 "
191         )
192     )]
193     UseValueDelimiter,
194     /// Deprecated, replaced with [`Arg::next_line_help`] and [`Arg::is_next_line_help_set`]
195     ///
196     /// Derive: replace `#[clap(setting = NextLineHelp)]` with `#[clap(next_line_help = true)]`
197     ///
198     /// Builder: replace `arg.setting(NextLineHelp)` with `arg.next_line_help(true)`
199     #[cfg_attr(
200         feature = "deprecated",
201         deprecated(
202             since = "3.1.0",
203             note = "Replaced with `Arg::next_line_help` and `Arg::is_next_line_help_set`
204 
205 Derive: replace `#[clap(setting = NextLineHelp)]` with `#[clap(next_line_help = true)]`
206 
207 Builder: replace `arg.setting(NextLineHelp)` with `arg.next_line_help(true)`
208 "
209         )
210     )]
211     NextLineHelp,
212     /// Deprecated, replaced with [`Arg::require_value_delimiter`] and
213     /// [`Arg::is_require_value_delimiter_set`]
214     ///
215     /// Derive: replace `#[clap(setting = RequireDelimiter)]` with `#[clap(require_value_delimiter = true)]`
216     ///
217     /// Builder: replace `arg.setting(RequireDelimiter)` with `arg.require_value_delimiter(true)`
218     #[cfg_attr(
219         feature = "deprecated",
220         deprecated(
221             since = "3.1.0",
222             note = "Replaced with `Arg::require_value_delimiter` and `Arg::is_require_value_delimiter_set`
223 
224 Derive: replace `#[clap(setting = RequireDelimiter)]` with `#[clap(require_value_delimiter = true)]`
225 
226 Builder: replace `arg.setting(RequireDelimiter)` with `arg.require_value_delimiter(true)`
227 "
228         )
229     )]
230     RequireDelimiter,
231     /// Deprecated, replaced with [`Arg::hide_possible_values`] and
232     /// [`Arg::is_hide_possible_values_set`]
233     ///
234     /// Derive: replace `#[clap(setting = HidePossibleValues)]` with `#[clap(hide_possible_values = true)]`
235     ///
236     /// Builder: replace `arg.setting(HidePossibleValues)` with `arg.hide_possible_values(true)`
237     #[cfg_attr(
238         feature = "deprecated",
239         deprecated(
240             since = "3.1.0",
241             note = "Replaced with `Arg::hide_possible_values` and `Arg::is_hide_possible_values_set`
242 
243 Derive: replace `#[clap(setting = HidePossibleValues)]` with `#[clap(hide_possible_values = true)]`
244 
245 Builder: replace `arg.setting(HidePossibleValues)` with `arg.hide_possible_values(true)`
246 "
247         )
248     )]
249     HidePossibleValues,
250     /// Deprecated, replaced with [`Arg::allow_hyphen_values`] and
251     /// [`Arg::is_allow_hyphen_values_set`]
252     ///
253     /// Derive: replace `#[clap(setting = AllowHyphenValues)]` with `#[clap(allow_hyphen_values = true)]`
254     ///
255     /// Builder: replace `arg.setting(AllowHyphenValues)` with `arg.allow_hyphen_values(true)`
256     #[cfg_attr(
257         feature = "deprecated",
258         deprecated(
259             since = "3.1.0",
260             note = "Replaced with `Arg::allow_hyphen_values` and `Arg::is_allow_hyphen_values_set`
261 
262 Derive: replace `#[clap(setting = AllowHyphenValues)]` with `#[clap(allow_hyphen_values = true)]`
263 
264 Builder: replace `arg.setting(AllowHyphenValues)` with `arg.allow_hyphen_values(true)`
265 "
266         )
267     )]
268     AllowHyphenValues,
269     /// Deprecated, replaced with [`Arg::allow_hyphen_values`] and
270     /// [`Arg::is_allow_hyphen_values_set`]
271     ///
272     /// Derive: replace `#[clap(setting = AllowLeadingHyphen)]` with `#[clap(allow_hyphen_values = true)]`
273     ///
274     /// Builder: replace `arg.setting(AllowLeadingHyphen)` with `arg.allow_hyphen_values(true)`
275     #[cfg_attr(
276         feature = "deprecated",
277         deprecated(
278             since = "3.0.0",
279             note = "Replaced with `Arg::allow_hyphen_values` and `Arg::is_allow_hyphen_values_set`
280 
281 Derive: replace `#[clap(setting = AllowLeadingHyphen)]` with `#[clap(allow_hyphen_values = true)]`
282 
283 Builder: replace `arg.setting(AllowLeadingHyphen)` with `arg.allow_hyphen_values(true)`
284 "
285         )
286     )]
287     #[doc(hidden)]
288     AllowLeadingHyphen,
289     /// Deprecated, replaced with [`Arg::require_equals`] and [`Arg::is_require_equals_set`]
290     ///
291     /// Derive: replace `#[clap(setting = RequireEquals)]` with `#[clap(require_equals = true)]`
292     ///
293     /// Builder: replace `arg.setting(RequireEquals)` with `arg.require_equals(true)`
294     #[cfg_attr(
295         feature = "deprecated",
296         deprecated(
297             since = "3.1.0",
298             note = "Replaced with `Arg::require_equals` and `Arg::is_require_equals_set`
299 
300 Derive: replace `#[clap(setting = RequireEquals)]` with `#[clap(require_equals = true)]`
301 
302 Builder: replace `arg.setting(RequireEquals)` with `arg.require_equals(true)`
303 "
304         )
305     )]
306     RequireEquals,
307     /// Deprecated, replaced with [`Arg::last`] and [`Arg::is_last_set`]
308     ///
309     /// Derive: replace `#[clap(setting = Last)]` with `#[clap(last = true)]`
310     ///
311     /// Builder: replace `arg.setting(Last)` with `arg.last(true)`
312     #[cfg_attr(
313         feature = "deprecated",
314         deprecated(
315             since = "3.1.0",
316             note = "Replaced with `Arg::last` and `Arg::is_last_set`
317 
318 Derive: replace `#[clap(setting = Last)]` with `#[clap(last = true)]`
319 
320 Builder: replace `arg.setting(Last)` with `arg.last(true)`
321 "
322         )
323     )]
324     Last,
325     /// Deprecated, replaced with [`Arg::hide_default_value`] and [`Arg::is_hide_default_value_set`]
326     ///
327     /// Derive: replace `#[clap(setting = HideDefaultValue)]` with `#[clap(hide_default_value = true)]`
328     ///
329     /// Builder: replace `arg.setting(HideDefaultValue)` with `arg.hide_default_value(true)`
330     #[cfg_attr(
331         feature = "deprecated",
332         deprecated(
333             since = "3.1.0",
334             note = "Replaced with `Arg::hide_default_value` and `Arg::is_hide_default_value_set`
335 
336 Derive: replace `#[clap(setting = HideDefaultValue)]` with `#[clap(hide_default_value = true)]`
337 
338 Builder: replace `arg.setting(HideDefaultValue)` with `arg.hide_default_value(true)`
339 "
340         )
341     )]
342     HideDefaultValue,
343     /// Deprecated, replaced with [`Arg::ignore_case`] and [`Arg::is_ignore_case_set`]
344     ///
345     /// Derive: replace `#[clap(setting = IgnoreCase)]` with `#[clap(ignore_case = true)]`
346     ///
347     /// Builder: replace `arg.setting(IgnoreCase)` with `arg.ignore_case(true)`
348     #[cfg_attr(
349         feature = "deprecated",
350         deprecated(
351             since = "3.1.0",
352             note = "Replaced with `Arg::ignore_case` and `Arg::is_ignore_case_set`
353 
354 Derive: replace `#[clap(setting = IgnoreCase)]` with `#[clap(ignore_case = true)]`
355 
356 Builder: replace `arg.setting(IgnoreCase)` with `arg.ignore_case(true)`
357 "
358         )
359     )]
360     IgnoreCase,
361     /// Deprecated, replaced with [`Arg::ignore_case`] and [`Arg::is_ignore_case_set`]
362     ///
363     /// Derive: replace `#[clap(setting = CaseInsensitive)]` with `#[clap(ignore_case = true)]`
364     ///
365     /// Builder: replace `arg.setting(CaseInsensitive)` with `arg.ignore_case(true)`
366     #[cfg_attr(
367         feature = "deprecated",
368         deprecated(
369             since = "3.0.0",
370             note = "Replaced with `Arg::ignore_case` and `Arg::is_ignore_case_set`
371 
372 Derive: replace `#[clap(setting = CaseInsensitive)]` with `#[clap(ignore_case = true)]`
373 
374 Builder: replace `arg.setting(CaseInsensitive)` with `arg.ignore_case(true)`
375 "
376         )
377     )]
378     #[doc(hidden)]
379     CaseInsensitive,
380     /// Deprecated, replaced with [`Arg::hide_env`] and [`Arg::is_hide_env_set`]
381     ///
382     /// Derive: replace `#[clap(setting = HideEnv)]` with `#[clap(hide_env = true)]`
383     ///
384     /// Builder: replace `arg.setting(HideEnv)` with `arg.hide_env(true)`
385     #[cfg_attr(
386         feature = "deprecated",
387         deprecated(
388             since = "3.1.0",
389             note = "Replaced with `Arg::hide_env` and `Arg::is_hide_env_set`
390 
391 Derive: replace `#[clap(setting = HideEnv)]` with `#[clap(hide_env = true)]`
392 
393 Builder: replace `arg.setting(HideEnv)` with `arg.hide_env(true)`
394 "
395         )
396     )]
397     #[cfg(feature = "env")]
398     HideEnv,
399     /// Deprecated, replaced with [`Arg::hide_env_values`] and [`Arg::is_hide_env_values_set`]
400     ///
401     /// Derive: replace `#[clap(setting = HideEnvValues)]` with `#[clap(hide_env_values = true)]`
402     ///
403     /// Builder: replace `arg.setting(HideEnvValues)` with `arg.hide_env_values(true)`
404     #[cfg_attr(
405         feature = "deprecated",
406         deprecated(
407             since = "3.1.0",
408             note = "Replaced with `Arg::hide_env_values` and `Arg::is_hide_env_values_set`
409 
410 Derive: replace `#[clap(setting = HideEnvValues)]` with `#[clap(hide_env_values = true)]`
411 
412 Builder: replace `arg.setting(HideEnvValues)` with `arg.hide_env_values(true)`
413 "
414         )
415     )]
416     #[cfg(feature = "env")]
417     HideEnvValues,
418     /// Deprecated, replaced with [`Arg::hide_short_help`] and [`Arg::is_hide_short_help_set`]
419     ///
420     /// Derive: replace `#[clap(setting = HiddenShortHelp)]` with `#[clap(hide_short_help = true)]`
421     ///
422     /// Builder: replace `arg.setting(HiddenShortHelp)` with `arg.hide_short_help(true)`
423     #[cfg_attr(
424         feature = "deprecated",
425         deprecated(
426             since = "3.1.0",
427             note = "Replaced with `Arg::hide_short_help` and `Arg::is_hide_short_help_set`
428 
429 Derive: replace `#[clap(setting = HiddenShortHelp)]` with `#[clap(hide_short_help = true)]`
430 
431 Builder: replace `arg.setting(HiddenShortHelp)` with `arg.hide_short_help(true)`
432 "
433         )
434     )]
435     HiddenShortHelp,
436     /// Deprecated, replaced with [`Arg::hide_long_help`] and [`Arg::is_hide_long_help_set`]
437     ///
438     /// Derive: replace `#[clap(setting = HiddenLongHelp)]` with `#[clap(hide_long_help = true)]`
439     ///
440     /// Builder: replace `arg.setting(HiddenLongHelp)` with `arg.hide_long_help(true)`
441     #[cfg_attr(
442         feature = "deprecated",
443         deprecated(
444             since = "3.1.0",
445             note = "Replaced with `Arg::hide_long_help` and `Arg::is_hide_long_help_set`
446 
447 Derive: replace `#[clap(setting = HiddenLongHelp)]` with `#[clap(hide_long_help = true)]`
448 
449 Builder: replace `arg.setting(HiddenLongHelp)` with `arg.hide_long_help(true)`
450 "
451         )
452     )]
453     HiddenLongHelp,
454     /// Deprecated, replaced with [`Arg::value_parser`]
455     ///
456     /// Derive: replace `#[clap(setting = AllowInvalidUtf8)]` with `#[clap(action)]` (which opts-in to the
457     /// new clap v4 behavior which gets the type via `value_parser!`)
458     ///
459     /// Builder: replace `arg.setting(AllowInvalidUtf8)` with `arg.value_parser(value_parser!(T))` where
460     /// `T` is the type of interest, like `OsString` or `PathBuf`, and `matches.value_of_os` with
461     /// `matches.get_one::<T>` or `matches.values_of_os` with `matches.get_many::<T>`
462     #[cfg_attr(
463         feature = "deprecated",
464         deprecated(
465             since = "3.1.0",
466             note = "Replaced with `value_parser`
467 
468 Derive: replace `#[clap(setting = AllowInvalidUtf8)]` with `#[clap(action)]` (which opts-in to the
469 new clap v4 behavior which gets the type via `value_parser!`)
470 
471 Builder: replace `arg.setting(AllowInvalidUtf8)` with `arg.value_parser(value_parser!(T))` where
472 `T` is the type of interest, like `OsString` or `PathBuf`, and `matches.value_of_os` with
473 `matches.get_one::<T>` or `matches.values_of_os` with `matches.get_many::<T>`
474 "
475         )
476     )]
477     AllowInvalidUtf8,
478     /// Deprecated, replaced with [`Arg::exclusive`] and [`Arg::is_exclusive_set`]
479     ///
480     /// Derive: replace `#[clap(setting = Exclusive)]` with `#[clap(exclusive = true)]`
481     ///
482     /// Builder: replace `arg.setting(Exclusive)` with `arg.exclusive(true)`
483     #[cfg_attr(
484         feature = "deprecated",
485         deprecated(
486             since = "3.1.0",
487             note = "Replaced with `Arg::exclusive` and `Arg::is_exclusive_set`
488 
489 Derive: replace `#[clap(setting = Exclusive)]` with `#[clap(exclusive = true)]`
490 
491 Builder: replace `arg.setting(Exclusive)` with `arg.exclusive(true)`
492 "
493         )
494     )]
495     Exclusive,
496 }
497 
498 bitflags! {
499     struct Flags: u32 {
500         const REQUIRED         = 1;
501         const MULTIPLE_OCC     = 1 << 1;
502         const NO_EMPTY_VALS    = 1 << 2;
503         const GLOBAL           = 1 << 3;
504         const HIDDEN           = 1 << 4;
505         const TAKES_VAL        = 1 << 5;
506         const USE_DELIM        = 1 << 6;
507         const NEXT_LINE_HELP   = 1 << 7;
508         const REQ_DELIM        = 1 << 9;
509         const DELIM_NOT_SET    = 1 << 10;
510         const HIDE_POS_VALS    = 1 << 11;
511         const ALLOW_TAC_VALS   = 1 << 12;
512         const REQUIRE_EQUALS   = 1 << 13;
513         const LAST             = 1 << 14;
514         const HIDE_DEFAULT_VAL = 1 << 15;
515         const CASE_INSENSITIVE = 1 << 16;
516         #[cfg(feature = "env")]
517         const HIDE_ENV_VALS    = 1 << 17;
518         const HIDDEN_SHORT_H   = 1 << 18;
519         const HIDDEN_LONG_H    = 1 << 19;
520         const MULTIPLE_VALS    = 1 << 20;
521         const MULTIPLE         = Self::MULTIPLE_OCC.bits | Self::MULTIPLE_VALS.bits;
522         #[cfg(feature = "env")]
523         const HIDE_ENV         = 1 << 21;
524         const UTF8_NONE        = 1 << 22;
525         const EXCLUSIVE        = 1 << 23;
526         const NO_OP            = 0;
527     }
528 }
529 
530 impl_settings! { ArgSettings, ArgFlags,
531     Required => Flags::REQUIRED,
532     MultipleOccurrences => Flags::MULTIPLE_OCC,
533     MultipleValues => Flags::MULTIPLE_VALS,
534     Multiple => Flags::MULTIPLE,
535     ForbidEmptyValues => Flags::NO_EMPTY_VALS,
536     Global => Flags::GLOBAL,
537     Hidden => Flags::HIDDEN,
538     TakesValue => Flags::TAKES_VAL,
539     UseValueDelimiter => Flags::USE_DELIM,
540     NextLineHelp => Flags::NEXT_LINE_HELP,
541     RequireDelimiter => Flags::REQ_DELIM,
542     HidePossibleValues => Flags::HIDE_POS_VALS,
543     AllowHyphenValues => Flags::ALLOW_TAC_VALS,
544     AllowLeadingHyphen => Flags::ALLOW_TAC_VALS,
545     RequireEquals => Flags::REQUIRE_EQUALS,
546     Last => Flags::LAST,
547     IgnoreCase => Flags::CASE_INSENSITIVE,
548     CaseInsensitive => Flags::CASE_INSENSITIVE,
549     #[cfg(feature = "env")]
550     HideEnv => Flags::HIDE_ENV,
551     #[cfg(feature = "env")]
552     HideEnvValues => Flags::HIDE_ENV_VALS,
553     HideDefaultValue => Flags::HIDE_DEFAULT_VAL,
554     HiddenShortHelp => Flags::HIDDEN_SHORT_H,
555     HiddenLongHelp => Flags::HIDDEN_LONG_H,
556     AllowInvalidUtf8 => Flags::UTF8_NONE,
557     Exclusive => Flags::EXCLUSIVE
558 }
559 
560 /// Deprecated in [Issue #3087](https://github.com/clap-rs/clap/issues/3087), maybe [`clap::Parser`][crate::Parser] would fit your use case?
561 #[cfg(feature = "yaml")]
562 impl FromStr for ArgSettings {
563     type Err = String;
from_str(s: &str) -> Result<Self, <Self as FromStr>::Err>564     fn from_str(s: &str) -> Result<Self, <Self as FromStr>::Err> {
565         #[allow(deprecated)]
566         #[allow(unreachable_patterns)]
567         match &*s.to_ascii_lowercase() {
568             "required" => Ok(ArgSettings::Required),
569             "multipleoccurrences" => Ok(ArgSettings::MultipleOccurrences),
570             "multiplevalues" => Ok(ArgSettings::MultipleValues),
571             "multiple" => Ok(ArgSettings::Multiple),
572             "forbidemptyvalues" => Ok(ArgSettings::ForbidEmptyValues),
573             "global" => Ok(ArgSettings::Global),
574             "hidden" => Ok(ArgSettings::Hidden),
575             "takesvalue" => Ok(ArgSettings::TakesValue),
576             "usevaluedelimiter" => Ok(ArgSettings::UseValueDelimiter),
577             "nextlinehelp" => Ok(ArgSettings::NextLineHelp),
578             "requiredelimiter" => Ok(ArgSettings::RequireDelimiter),
579             "hidepossiblevalues" => Ok(ArgSettings::HidePossibleValues),
580             "allowhyphenvalues" => Ok(ArgSettings::AllowHyphenValues),
581             "allowleadinghypyhen" => Ok(ArgSettings::AllowLeadingHyphen),
582             "requireequals" => Ok(ArgSettings::RequireEquals),
583             "last" => Ok(ArgSettings::Last),
584             "ignorecase" => Ok(ArgSettings::IgnoreCase),
585             "caseinsensitive" => Ok(ArgSettings::CaseInsensitive),
586             #[cfg(feature = "env")]
587             "hideenv" => Ok(ArgSettings::HideEnv),
588             #[cfg(feature = "env")]
589             "hideenvvalues" => Ok(ArgSettings::HideEnvValues),
590             "hidedefaultvalue" => Ok(ArgSettings::HideDefaultValue),
591             "hiddenshorthelp" => Ok(ArgSettings::HiddenShortHelp),
592             "hiddenlonghelp" => Ok(ArgSettings::HiddenLongHelp),
593             "allowinvalidutf8" => Ok(ArgSettings::AllowInvalidUtf8),
594             "exclusive" => Ok(ArgSettings::Exclusive),
595             _ => Err(format!("unknown AppSetting: `{}`", s)),
596         }
597     }
598 }
599 
600 #[cfg(test)]
601 mod test {
602     #[test]
603     #[cfg(feature = "yaml")]
arg_settings_fromstr()604     fn arg_settings_fromstr() {
605         use super::ArgSettings;
606 
607         assert_eq!(
608             "allowhyphenvalues".parse::<ArgSettings>().unwrap(),
609             ArgSettings::AllowHyphenValues
610         );
611         assert_eq!(
612             "forbidemptyvalues".parse::<ArgSettings>().unwrap(),
613             ArgSettings::ForbidEmptyValues
614         );
615         assert_eq!(
616             "hidepossiblevalues".parse::<ArgSettings>().unwrap(),
617             ArgSettings::HidePossibleValues
618         );
619         assert_eq!(
620             "hidden".parse::<ArgSettings>().unwrap(),
621             ArgSettings::Hidden
622         );
623         assert_eq!(
624             "nextlinehelp".parse::<ArgSettings>().unwrap(),
625             ArgSettings::NextLineHelp
626         );
627         assert_eq!(
628             "requiredelimiter".parse::<ArgSettings>().unwrap(),
629             ArgSettings::RequireDelimiter
630         );
631         assert_eq!(
632             "required".parse::<ArgSettings>().unwrap(),
633             ArgSettings::Required
634         );
635         assert_eq!(
636             "takesvalue".parse::<ArgSettings>().unwrap(),
637             ArgSettings::TakesValue
638         );
639         assert_eq!(
640             "usevaluedelimiter".parse::<ArgSettings>().unwrap(),
641             ArgSettings::UseValueDelimiter
642         );
643         assert_eq!(
644             "requireequals".parse::<ArgSettings>().unwrap(),
645             ArgSettings::RequireEquals
646         );
647         assert_eq!("last".parse::<ArgSettings>().unwrap(), ArgSettings::Last);
648         assert_eq!(
649             "hidedefaultvalue".parse::<ArgSettings>().unwrap(),
650             ArgSettings::HideDefaultValue
651         );
652         assert_eq!(
653             "ignorecase".parse::<ArgSettings>().unwrap(),
654             ArgSettings::IgnoreCase
655         );
656         #[cfg(feature = "env")]
657         assert_eq!(
658             "hideenv".parse::<ArgSettings>().unwrap(),
659             ArgSettings::HideEnv
660         );
661         #[cfg(feature = "env")]
662         assert_eq!(
663             "hideenvvalues".parse::<ArgSettings>().unwrap(),
664             ArgSettings::HideEnvValues
665         );
666         assert_eq!(
667             "hiddenshorthelp".parse::<ArgSettings>().unwrap(),
668             ArgSettings::HiddenShortHelp
669         );
670         assert_eq!(
671             "hiddenlonghelp".parse::<ArgSettings>().unwrap(),
672             ArgSettings::HiddenLongHelp
673         );
674         assert_eq!(
675             "allowinvalidutf8".parse::<ArgSettings>().unwrap(),
676             ArgSettings::AllowInvalidUtf8
677         );
678         assert_eq!(
679             "exclusive".parse::<ArgSettings>().unwrap(),
680             ArgSettings::Exclusive
681         );
682         assert!("hahahaha".parse::<ArgSettings>().is_err());
683     }
684 }
685