1// Std
2use std::ops::BitOr;
3
4#[allow(unused)]
5use crate::Arg;
6#[allow(unused)]
7use crate::Command;
8
9// Third party
10use bitflags::bitflags;
11
12#[doc(hidden)]
13#[derive(Debug, Copy, Clone, PartialEq, Eq)]
14pub(crate) struct AppFlags(Flags);
15
16impl Default for AppFlags {
17    fn default() -> Self {
18        AppFlags(Flags::COLOR_AUTO)
19    }
20}
21
22/// Application level settings, which affect how [`Command`] operates
23///
24/// **NOTE:** When these settings are used, they apply only to current command, and are *not*
25/// propagated down or up through child or parent subcommands
26///
27/// [`Command`]: crate::Command
28#[derive(Debug, PartialEq, Copy, Clone)]
29#[non_exhaustive]
30pub(crate) enum AppSettings {
31    IgnoreErrors,
32    AllowHyphenValues,
33    AllowNegativeNumbers,
34    AllArgsOverrideSelf,
35    AllowMissingPositional,
36    TrailingVarArg,
37    DontDelimitTrailingValues,
38    InferLongArgs,
39    InferSubcommands,
40    SubcommandRequired,
41    AllowExternalSubcommands,
42    Multicall,
43    SubcommandsNegateReqs,
44    ArgsNegateSubcommands,
45    SubcommandPrecedenceOverArg,
46    ArgRequiredElseHelp,
47    NextLineHelp,
48    DisableColoredHelp,
49    DisableHelpFlag,
50    DisableHelpSubcommand,
51    DisableVersionFlag,
52    PropagateVersion,
53    Hidden,
54    HidePossibleValues,
55    HelpExpected,
56    NoBinaryName,
57    #[allow(dead_code)]
58    ColorAuto,
59    ColorAlways,
60    ColorNever,
61    Built,
62    BinNameBuilt,
63}
64
65bitflags! {
66    struct Flags: u64 {
67        const SC_NEGATE_REQS                 = 1;
68        const SC_REQUIRED                    = 1 << 1;
69        const ARG_REQUIRED_ELSE_HELP         = 1 << 2;
70        const PROPAGATE_VERSION              = 1 << 3;
71        const DISABLE_VERSION_FOR_SC         = 1 << 4;
72        const WAIT_ON_ERROR                  = 1 << 6;
73        const DISABLE_VERSION_FLAG           = 1 << 10;
74        const HIDDEN                         = 1 << 11;
75        const TRAILING_VARARG                = 1 << 12;
76        const NO_BIN_NAME                    = 1 << 13;
77        const ALLOW_UNK_SC                   = 1 << 14;
78        const LEADING_HYPHEN                 = 1 << 16;
79        const NO_POS_VALUES                  = 1 << 17;
80        const NEXT_LINE_HELP                 = 1 << 18;
81        const DISABLE_COLORED_HELP           = 1 << 20;
82        const COLOR_ALWAYS                   = 1 << 21;
83        const COLOR_AUTO                     = 1 << 22;
84        const COLOR_NEVER                    = 1 << 23;
85        const DONT_DELIM_TRAIL               = 1 << 24;
86        const ALLOW_NEG_NUMS                 = 1 << 25;
87        const DISABLE_HELP_SC                = 1 << 27;
88        const ARGS_NEGATE_SCS                = 1 << 29;
89        const PROPAGATE_VALS_DOWN            = 1 << 30;
90        const ALLOW_MISSING_POS              = 1 << 31;
91        const TRAILING_VALUES                = 1 << 32;
92        const BUILT                          = 1 << 33;
93        const BIN_NAME_BUILT                 = 1 << 34;
94        const VALID_ARG_FOUND                = 1 << 35;
95        const INFER_SUBCOMMANDS              = 1 << 36;
96        const CONTAINS_LAST                  = 1 << 37;
97        const ARGS_OVERRIDE_SELF             = 1 << 38;
98        const HELP_REQUIRED                  = 1 << 39;
99        const SUBCOMMAND_PRECEDENCE_OVER_ARG = 1 << 40;
100        const DISABLE_HELP_FLAG              = 1 << 41;
101        const INFER_LONG_ARGS                = 1 << 43;
102        const IGNORE_ERRORS                  = 1 << 44;
103        const MULTICALL                      = 1 << 45;
104        const EXPAND_HELP_SUBCOMMAND_TREES   = 1 << 46;
105        const NO_OP                          = 0;
106    }
107}
108
109impl_settings! { AppSettings, AppFlags,
110    ArgRequiredElseHelp
111        => Flags::ARG_REQUIRED_ELSE_HELP,
112    SubcommandPrecedenceOverArg
113        => Flags::SUBCOMMAND_PRECEDENCE_OVER_ARG,
114    ArgsNegateSubcommands
115        => Flags::ARGS_NEGATE_SCS,
116    AllowExternalSubcommands
117        => Flags::ALLOW_UNK_SC,
118    AllowHyphenValues
119        => Flags::LEADING_HYPHEN,
120    AllowNegativeNumbers
121        => Flags::ALLOW_NEG_NUMS,
122    AllowMissingPositional
123        => Flags::ALLOW_MISSING_POS,
124    ColorAlways
125        => Flags::COLOR_ALWAYS,
126    ColorAuto
127        => Flags::COLOR_AUTO,
128    ColorNever
129        => Flags::COLOR_NEVER,
130    DontDelimitTrailingValues
131        => Flags::DONT_DELIM_TRAIL,
132    DisableColoredHelp
133        => Flags::DISABLE_COLORED_HELP,
134    DisableHelpSubcommand
135        => Flags::DISABLE_HELP_SC,
136    DisableHelpFlag
137        => Flags::DISABLE_HELP_FLAG,
138    DisableVersionFlag
139        => Flags::DISABLE_VERSION_FLAG,
140    PropagateVersion
141        => Flags::PROPAGATE_VERSION,
142    HidePossibleValues
143        => Flags::NO_POS_VALUES,
144    HelpExpected
145        => Flags::HELP_REQUIRED,
146    Hidden
147        => Flags::HIDDEN,
148    Multicall
149        => Flags::MULTICALL,
150    NoBinaryName
151        => Flags::NO_BIN_NAME,
152    SubcommandsNegateReqs
153        => Flags::SC_NEGATE_REQS,
154    SubcommandRequired
155        => Flags::SC_REQUIRED,
156    TrailingVarArg
157        => Flags::TRAILING_VARARG,
158    NextLineHelp
159        => Flags::NEXT_LINE_HELP,
160    IgnoreErrors
161        => Flags::IGNORE_ERRORS,
162    Built
163        => Flags::BUILT,
164    BinNameBuilt
165        => Flags::BIN_NAME_BUILT,
166    InferSubcommands
167        => Flags::INFER_SUBCOMMANDS,
168    AllArgsOverrideSelf
169        => Flags::ARGS_OVERRIDE_SELF,
170    InferLongArgs
171        => Flags::INFER_LONG_ARGS
172}
173