xref: /aosp_15_r20/external/abseil-cpp/absl/flags/usage_config.h (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker //
2*9356374aSAndroid Build Coastguard Worker //  Copyright 2019 The Abseil Authors.
3*9356374aSAndroid Build Coastguard Worker //
4*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*9356374aSAndroid Build Coastguard Worker //
8*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
9*9356374aSAndroid Build Coastguard Worker //
10*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*9356374aSAndroid Build Coastguard Worker // limitations under the License.
15*9356374aSAndroid Build Coastguard Worker //
16*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
17*9356374aSAndroid Build Coastguard Worker // File: usage_config.h
18*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
19*9356374aSAndroid Build Coastguard Worker //
20*9356374aSAndroid Build Coastguard Worker // This file defines the main usage reporting configuration interfaces and
21*9356374aSAndroid Build Coastguard Worker // documents Abseil's supported built-in usage flags. If these flags are found
22*9356374aSAndroid Build Coastguard Worker // when parsing a command-line, Abseil will exit the program and display
23*9356374aSAndroid Build Coastguard Worker // appropriate help messages.
24*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_FLAGS_USAGE_CONFIG_H_
25*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAGS_USAGE_CONFIG_H_
26*9356374aSAndroid Build Coastguard Worker 
27*9356374aSAndroid Build Coastguard Worker #include <functional>
28*9356374aSAndroid Build Coastguard Worker #include <string>
29*9356374aSAndroid Build Coastguard Worker 
30*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
31*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
32*9356374aSAndroid Build Coastguard Worker 
33*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
34*9356374aSAndroid Build Coastguard Worker // Built-in Usage Flags
35*9356374aSAndroid Build Coastguard Worker // -----------------------------------------------------------------------------
36*9356374aSAndroid Build Coastguard Worker //
37*9356374aSAndroid Build Coastguard Worker // Abseil supports the following built-in usage flags. When passed, these flags
38*9356374aSAndroid Build Coastguard Worker // exit the program and :
39*9356374aSAndroid Build Coastguard Worker //
40*9356374aSAndroid Build Coastguard Worker // * --help
41*9356374aSAndroid Build Coastguard Worker //     Shows help on important flags for this binary
42*9356374aSAndroid Build Coastguard Worker // * --helpfull
43*9356374aSAndroid Build Coastguard Worker //     Shows help on all flags
44*9356374aSAndroid Build Coastguard Worker // * --helpshort
45*9356374aSAndroid Build Coastguard Worker //     Shows help on only the main module for this program
46*9356374aSAndroid Build Coastguard Worker // * --helppackage
47*9356374aSAndroid Build Coastguard Worker //     Shows help on all modules in the main package
48*9356374aSAndroid Build Coastguard Worker // * --version
49*9356374aSAndroid Build Coastguard Worker //     Shows the version and build info for this binary and exits
50*9356374aSAndroid Build Coastguard Worker // * --only_check_args
51*9356374aSAndroid Build Coastguard Worker //     Exits after checking all flags
52*9356374aSAndroid Build Coastguard Worker // * --helpon
53*9356374aSAndroid Build Coastguard Worker //     Shows help on the modules named by this flag value
54*9356374aSAndroid Build Coastguard Worker // * --helpmatch
55*9356374aSAndroid Build Coastguard Worker //     Shows help on modules whose name contains the specified substring
56*9356374aSAndroid Build Coastguard Worker 
57*9356374aSAndroid Build Coastguard Worker namespace absl {
58*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
59*9356374aSAndroid Build Coastguard Worker 
60*9356374aSAndroid Build Coastguard Worker namespace flags_internal {
61*9356374aSAndroid Build Coastguard Worker using FlagKindFilter = std::function<bool (absl::string_view)>;
62*9356374aSAndroid Build Coastguard Worker }  // namespace flags_internal
63*9356374aSAndroid Build Coastguard Worker 
64*9356374aSAndroid Build Coastguard Worker // FlagsUsageConfig
65*9356374aSAndroid Build Coastguard Worker //
66*9356374aSAndroid Build Coastguard Worker // This structure contains the collection of callbacks for changing the behavior
67*9356374aSAndroid Build Coastguard Worker // of the usage reporting routines in Abseil Flags.
68*9356374aSAndroid Build Coastguard Worker struct FlagsUsageConfig {
69*9356374aSAndroid Build Coastguard Worker   // Returns true if flags defined in the given source code file should be
70*9356374aSAndroid Build Coastguard Worker   // reported with --helpshort flag. For example, if the file
71*9356374aSAndroid Build Coastguard Worker   // "path/to/my/code.cc" defines the flag "--my_flag", and
72*9356374aSAndroid Build Coastguard Worker   // contains_helpshort_flags("path/to/my/code.cc") returns true, invoking the
73*9356374aSAndroid Build Coastguard Worker   // program with --helpshort will include information about --my_flag in the
74*9356374aSAndroid Build Coastguard Worker   // program output.
75*9356374aSAndroid Build Coastguard Worker   flags_internal::FlagKindFilter contains_helpshort_flags;
76*9356374aSAndroid Build Coastguard Worker 
77*9356374aSAndroid Build Coastguard Worker   // Returns true if flags defined in the filename should be reported with
78*9356374aSAndroid Build Coastguard Worker   // --help flag. For example, if the file
79*9356374aSAndroid Build Coastguard Worker   // "path/to/my/code.cc" defines the flag "--my_flag", and
80*9356374aSAndroid Build Coastguard Worker   // contains_help_flags("path/to/my/code.cc") returns true, invoking the
81*9356374aSAndroid Build Coastguard Worker   // program with --help will include information about --my_flag in the
82*9356374aSAndroid Build Coastguard Worker   // program output.
83*9356374aSAndroid Build Coastguard Worker   flags_internal::FlagKindFilter contains_help_flags;
84*9356374aSAndroid Build Coastguard Worker 
85*9356374aSAndroid Build Coastguard Worker   // Returns true if flags defined in the filename should be reported with
86*9356374aSAndroid Build Coastguard Worker   // --helppackage flag. For example, if the file
87*9356374aSAndroid Build Coastguard Worker   // "path/to/my/code.cc" defines the flag "--my_flag", and
88*9356374aSAndroid Build Coastguard Worker   // contains_helppackage_flags("path/to/my/code.cc") returns true, invoking the
89*9356374aSAndroid Build Coastguard Worker   // program with --helppackage will include information about --my_flag in the
90*9356374aSAndroid Build Coastguard Worker   // program output.
91*9356374aSAndroid Build Coastguard Worker   flags_internal::FlagKindFilter contains_helppackage_flags;
92*9356374aSAndroid Build Coastguard Worker 
93*9356374aSAndroid Build Coastguard Worker   // Generates string containing program version. This is the string reported
94*9356374aSAndroid Build Coastguard Worker   // when user specifies --version in a command line.
95*9356374aSAndroid Build Coastguard Worker   std::function<std::string()> version_string;
96*9356374aSAndroid Build Coastguard Worker 
97*9356374aSAndroid Build Coastguard Worker   // Normalizes the filename specific to the build system/filesystem used. This
98*9356374aSAndroid Build Coastguard Worker   // routine is used when we report the information about the flag definition
99*9356374aSAndroid Build Coastguard Worker   // location. For instance, if your build resides at some location you do not
100*9356374aSAndroid Build Coastguard Worker   // want to expose in the usage output, you can trim it to show only relevant
101*9356374aSAndroid Build Coastguard Worker   // part.
102*9356374aSAndroid Build Coastguard Worker   // For example:
103*9356374aSAndroid Build Coastguard Worker   //   normalize_filename("/my_company/some_long_path/src/project/file.cc")
104*9356374aSAndroid Build Coastguard Worker   // might produce
105*9356374aSAndroid Build Coastguard Worker   //   "project/file.cc".
106*9356374aSAndroid Build Coastguard Worker   std::function<std::string(absl::string_view)> normalize_filename;
107*9356374aSAndroid Build Coastguard Worker };
108*9356374aSAndroid Build Coastguard Worker 
109*9356374aSAndroid Build Coastguard Worker // SetFlagsUsageConfig()
110*9356374aSAndroid Build Coastguard Worker //
111*9356374aSAndroid Build Coastguard Worker // Sets the usage reporting configuration callbacks. If any of the callbacks are
112*9356374aSAndroid Build Coastguard Worker // not set in usage_config instance, then the default value of the callback is
113*9356374aSAndroid Build Coastguard Worker // used.
114*9356374aSAndroid Build Coastguard Worker void SetFlagsUsageConfig(FlagsUsageConfig usage_config);
115*9356374aSAndroid Build Coastguard Worker 
116*9356374aSAndroid Build Coastguard Worker namespace flags_internal {
117*9356374aSAndroid Build Coastguard Worker 
118*9356374aSAndroid Build Coastguard Worker FlagsUsageConfig GetUsageConfig();
119*9356374aSAndroid Build Coastguard Worker 
120*9356374aSAndroid Build Coastguard Worker void ReportUsageError(absl::string_view msg, bool is_fatal);
121*9356374aSAndroid Build Coastguard Worker 
122*9356374aSAndroid Build Coastguard Worker }  // namespace flags_internal
123*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
124*9356374aSAndroid Build Coastguard Worker }  // namespace absl
125*9356374aSAndroid Build Coastguard Worker 
126*9356374aSAndroid Build Coastguard Worker extern "C" {
127*9356374aSAndroid Build Coastguard Worker 
128*9356374aSAndroid Build Coastguard Worker // Additional report of fatal usage error message before we std::exit. Error is
129*9356374aSAndroid Build Coastguard Worker // fatal if is_fatal argument to ReportUsageError is true.
130*9356374aSAndroid Build Coastguard Worker void ABSL_INTERNAL_C_SYMBOL(AbslInternalReportFatalUsageError)(
131*9356374aSAndroid Build Coastguard Worker     absl::string_view);
132*9356374aSAndroid Build Coastguard Worker 
133*9356374aSAndroid Build Coastguard Worker }  // extern "C"
134*9356374aSAndroid Build Coastguard Worker 
135*9356374aSAndroid Build Coastguard Worker #endif  // ABSL_FLAGS_USAGE_CONFIG_H_
136