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