CLI11
C++11 Command Line Interface Parser
Loading...
Searching...
No Matches
FormatterFwd.hpp
1// Copyright (c) 2017-2024, University of Cincinnati, developed by Henry Schreiner
2// under NSF AWARD 1414736 and by the respective contributors.
3// All rights reserved.
4//
5// SPDX-License-Identifier: BSD-3-Clause
6
7#pragma once
8
9// IWYU pragma: private, include "CLI/CLI.hpp"
10
11// [CLI11:public_includes:set]
12#include <functional>
13#include <map>
14#include <string>
15#include <utility>
16#include <vector>
17// [CLI11:public_includes:end]
18
19#include "StringTools.hpp"
20
21namespace CLI {
22// [CLI11:formatter_fwd_hpp:verbatim]
23
24class Option;
25class App;
26
31
32enum class AppFormatMode {
33 Normal,
34 All,
35 Sub,
36};
37
43 protected:
46
48 std::size_t column_width_{30};
49
52 std::map<std::string, std::string> labels_{};
53
57
58 public:
59 FormatterBase() = default;
60 FormatterBase(const FormatterBase &) = default;
61 FormatterBase(FormatterBase &&) = default;
62 FormatterBase &operator=(const FormatterBase &) = default;
63 FormatterBase &operator=(FormatterBase &&) = default;
64
66 virtual ~FormatterBase() noexcept {} // NOLINT(modernize-use-equals-default)
67
69 virtual std::string make_help(const App *, std::string, AppFormatMode) const = 0;
70
74
76 void label(std::string key, std::string val) { labels_[key] = val; }
77
79 void column_width(std::size_t val) { column_width_ = val; }
80
84
86 CLI11_NODISCARD std::string get_label(std::string key) const {
87 if(labels_.find(key) == labels_.end())
88 return key;
89 return labels_.at(key);
90 }
91
93 CLI11_NODISCARD std::size_t get_column_width() const { return column_width_; }
94
96};
97
99class FormatterLambda final : public FormatterBase {
100 using funct_t = std::function<std::string(const App *, std::string, AppFormatMode)>;
101
103 funct_t lambda_;
104
105 public:
107 explicit FormatterLambda(funct_t funct) : lambda_(std::move(funct)) {}
108
110 ~FormatterLambda() noexcept override {} // NOLINT(modernize-use-equals-default)
111
113 std::string make_help(const App *app, std::string name, AppFormatMode mode) const override {
114 return lambda_(app, name, mode);
115 }
116};
117
120class Formatter : public FormatterBase {
121 public:
122 Formatter() = default;
123 Formatter(const Formatter &) = default;
124 Formatter(Formatter &&) = default;
125 Formatter &operator=(const Formatter &) = default;
126 Formatter &operator=(Formatter &&) = default;
127
130
133 CLI11_NODISCARD virtual std::string
134 make_group(std::string group, bool is_positional, std::vector<const Option *> opts) const;
135
137 virtual std::string make_positionals(const App *app) const;
138
140 std::string make_groups(const App *app, AppFormatMode mode) const;
141
143 virtual std::string make_subcommands(const App *app, AppFormatMode mode) const;
144
146 virtual std::string make_subcommand(const App *sub) const;
147
149 virtual std::string make_expanded(const App *sub) const;
150
152 virtual std::string make_footer(const App *app) const;
153
155 virtual std::string make_description(const App *app) const;
156
158 virtual std::string make_usage(const App *app, std::string name) const;
159
161 std::string make_help(const App * /*app*/, std::string, AppFormatMode) const override;
162
166
168 virtual std::string make_option(const Option *opt, bool is_positional) const {
169 std::stringstream out;
170 detail::format_help(
171 out, make_option_name(opt, is_positional) + make_option_opts(opt), make_option_desc(opt), column_width_);
172 return out.str();
173 }
174
176 virtual std::string make_option_name(const Option *, bool) const;
177
179 virtual std::string make_option_opts(const Option *) const;
180
182 virtual std::string make_option_desc(const Option *) const;
183
185 virtual std::string make_option_usage(const Option *opt) const;
186
188};
189
190// [CLI11:formatter_fwd_hpp:end]
191} // namespace CLI
Creates a command line program, with very few defaults.
Definition App.hpp:90
Definition FormatterFwd.hpp:42
std::size_t column_width_
The width of the first column.
Definition FormatterFwd.hpp:48
std::map< std::string, std::string > labels_
The required help printout labels (user changeable) Values are Needs, Excludes, etc.
Definition FormatterFwd.hpp:52
CLI11_NODISCARD std::size_t get_column_width() const
Get the current column width.
Definition FormatterFwd.hpp:93
CLI11_NODISCARD std::string get_label(std::string key) const
Get the current value of a name (REQUIRED, etc.)
Definition FormatterFwd.hpp:86
void label(std::string key, std::string val)
Set the "REQUIRED" label.
Definition FormatterFwd.hpp:76
virtual ~FormatterBase() noexcept
Adding a destructor in this form to work around bug in GCC 4.7.
Definition FormatterFwd.hpp:66
virtual std::string make_help(const App *, std::string, AppFormatMode) const =0
This is the key method that puts together help.
void column_width(std::size_t val)
Set the column width.
Definition FormatterFwd.hpp:79
Definition FormatterFwd.hpp:120
std::string make_help(const App *, std::string, AppFormatMode) const override
This puts everything together.
Definition Formatter_inl.hpp:150
virtual std::string make_option(const Option *opt, bool is_positional) const
This prints out an option help line, either positional or optional form.
Definition FormatterFwd.hpp:168
std::string make_groups(const App *app, AppFormatMode mode) const
This prints out all the groups of options.
Definition Formatter_inl.hpp:45
virtual std::string make_usage(const App *app, std::string name) const
This displays the usage line.
Definition Formatter_inl.hpp:95
virtual std::string make_option_name(const Option *, bool) const
This is the name part of an option, Default: left column.
Definition Formatter_inl.hpp:245
virtual CLI11_NODISCARD std::string make_group(std::string group, bool is_positional, std::vector< const Option * > opts) const
Definition Formatter_inl.hpp:24
virtual std::string make_footer(const App *app) const
This prints out all the groups of options.
Definition Formatter_inl.hpp:142
virtual std::string make_option_usage(const Option *opt) const
This is used to print the name on the USAGE line.
Definition Formatter_inl.hpp:289
virtual std::string make_subcommand(const App *sub) const
This prints out a subcommand.
Definition Formatter_inl.hpp:216
virtual std::string make_positionals(const App *app) const
This prints out just the positionals "group".
Definition Formatter_inl.hpp:35
virtual std::string make_subcommands(const App *app, AppFormatMode mode) const
This prints out all the subcommands.
Definition Formatter_inl.hpp:174
virtual std::string make_description(const App *app) const
This displays the description line.
Definition Formatter_inl.hpp:69
virtual std::string make_option_desc(const Option *) const
This is the description. Default: Right column, on new line if left column too large.
Definition Formatter_inl.hpp:287
virtual std::string make_option_opts(const Option *) const
This is the options part of the name, Default: combined into left column.
Definition Formatter_inl.hpp:252
virtual std::string make_expanded(const App *sub) const
This prints out a subcommand in help-all.
Definition Formatter_inl.hpp:225
This is a specialty override for lambda functions.
Definition FormatterFwd.hpp:99
std::string make_help(const App *app, std::string name, AppFormatMode mode) const override
This will simply call the lambda function.
Definition FormatterFwd.hpp:113
~FormatterLambda() noexcept override
Adding a destructor (mostly to make GCC 4.7 happy)
Definition FormatterFwd.hpp:110
FormatterLambda(funct_t funct)
Create a FormatterLambda with a lambda function.
Definition FormatterFwd.hpp:107
Definition Option.hpp:231