usage_config.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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. #include <functional>
  27. #include <string>
  28. #include "absl/base/config.h"
  29. #include "absl/strings/string_view.h"
  30. // -----------------------------------------------------------------------------
  31. // Built-in Usage Flags
  32. // -----------------------------------------------------------------------------
  33. //
  34. // Abseil supports the following built-in usage flags. When passed, these flags
  35. // exit the program and :
  36. //
  37. // * --help
  38. // Shows help on important flags for this binary
  39. // * --helpfull
  40. // Shows help on all flags
  41. // * --helpshort
  42. // Shows help on only the main module for this program
  43. // * --helppackage
  44. // Shows help on all modules in the main package
  45. // * --version
  46. // Shows the version and build info for this binary and exits
  47. // * --only_check_args
  48. // Exits after checking all flags
  49. // * --helpon
  50. // Shows help on the modules named by this flag value
  51. // * --helpmatch
  52. // Shows help on modules whose name contains the specified substring
  53. namespace absl {
  54. ABSL_NAMESPACE_BEGIN
  55. namespace flags_internal {
  56. using FlagKindFilter = std::function<bool (absl::string_view)>;
  57. } // namespace flags_internal
  58. // FlagsUsageConfig
  59. //
  60. // This structure contains the collection of callbacks for changing the behavior
  61. // of the usage reporting routines in Abseil Flags.
  62. struct FlagsUsageConfig {
  63. // Returns true if flags defined in the given source code file should be
  64. // reported with --helpshort flag. For example, if the file
  65. // "path/to/my/code.cc" defines the flag "--my_flag", and
  66. // contains_helpshort_flags("path/to/my/code.cc") returns true, invoking the
  67. // program with --helpshort will include information about --my_flag in the
  68. // program output.
  69. flags_internal::FlagKindFilter contains_helpshort_flags;
  70. // Returns true if flags defined in the filename should be reported with
  71. // --help flag. For example, if the file
  72. // "path/to/my/code.cc" defines the flag "--my_flag", and
  73. // contains_help_flags("path/to/my/code.cc") returns true, invoking the
  74. // program with --help will include information about --my_flag in the
  75. // program output.
  76. flags_internal::FlagKindFilter contains_help_flags;
  77. // Returns true if flags defined in the filename should be reported with
  78. // --helppackage flag. For example, if the file
  79. // "path/to/my/code.cc" defines the flag "--my_flag", and
  80. // contains_helppackage_flags("path/to/my/code.cc") returns true, invoking the
  81. // program with --helppackage will include information about --my_flag in the
  82. // program output.
  83. flags_internal::FlagKindFilter contains_helppackage_flags;
  84. // Generates string containing program version. This is the string reported
  85. // when user specifies --version in a command line.
  86. std::function<std::string()> version_string;
  87. // Normalizes the filename specific to the build system/filesystem used. This
  88. // routine is used when we report the information about the flag definition
  89. // location. For instance, if your build resides at some location you do not
  90. // want to expose in the usage output, you can trim it to show only relevant
  91. // part.
  92. // For example:
  93. // normalize_filename("/my_company/some_long_path/src/project/file.cc")
  94. // might produce
  95. // "project/file.cc".
  96. std::function<std::string(absl::string_view)> normalize_filename;
  97. };
  98. // SetFlagsUsageConfig()
  99. //
  100. // Sets the usage reporting configuration callbacks. If any of the callbacks are
  101. // not set in usage_config instance, then the default value of the callback is
  102. // used.
  103. void SetFlagsUsageConfig(FlagsUsageConfig usage_config);
  104. namespace flags_internal {
  105. FlagsUsageConfig GetUsageConfig();
  106. void ReportUsageError(absl::string_view msg, bool is_fatal);
  107. } // namespace flags_internal
  108. ABSL_NAMESPACE_END
  109. } // namespace absl
  110. extern "C" {
  111. // Additional report of fatal usage error message before we std::exit. Error is
  112. // fatal if is_fatal argument to ReportUsageError is true.
  113. void ABSL_INTERNAL_C_SYMBOL(AbslInternalReportFatalUsageError)(
  114. absl::string_view);
  115. } // extern "C"
  116. #endif // ABSL_FLAGS_USAGE_CONFIG_H_