CLI11  1.9.1
FormatterFwd.hpp
Go to the documentation of this file.
1 // Copyright (c) 2017-2020, 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 #include <map>
10 #include <string>
11 #include <utility>
12 #include <vector>
13 
14 #include "StringTools.hpp"
15 
16 namespace CLI {
17 
18 class Option;
19 class App;
20 
25 
26 enum class AppFormatMode {
27  Normal,
28  All,
29  Sub,
30 };
31 
37  protected:
40 
42  std::size_t column_width_{30};
43 
46  std::map<std::string, std::string> labels_{};
47 
51 
52  public:
53  FormatterBase() = default;
54  FormatterBase(const FormatterBase &) = default;
56 
58  virtual ~FormatterBase() noexcept {} // NOLINT(modernize-use-equals-default)
59 
61  virtual std::string make_help(const App *, std::string, AppFormatMode) const = 0;
62 
66 
68  void label(std::string key, std::string val) { labels_[key] = val; }
69 
71  void column_width(std::size_t val) { column_width_ = val; }
72 
76 
78  std::string get_label(std::string key) const {
79  if(labels_.find(key) == labels_.end())
80  return key;
81  else
82  return labels_.at(key);
83  }
84 
86  std::size_t get_column_width() const { return column_width_; }
87 
89 };
90 
92 class FormatterLambda final : public FormatterBase {
93  using funct_t = std::function<std::string(const App *, std::string, AppFormatMode)>;
94 
96  funct_t lambda_;
97 
98  public:
100  explicit FormatterLambda(funct_t funct) : lambda_(std::move(funct)) {}
101 
103  ~FormatterLambda() noexcept override {} // NOLINT(modernize-use-equals-default)
104 
106  std::string make_help(const App *app, std::string name, AppFormatMode mode) const override {
107  return lambda_(app, name, mode);
108  }
109 };
110 
113 class Formatter : public FormatterBase {
114  public:
115  Formatter() = default;
116  Formatter(const Formatter &) = default;
117  Formatter(Formatter &&) = default;
118 
121 
124  virtual std::string make_group(std::string group, bool is_positional, std::vector<const Option *> opts) const;
125 
127  virtual std::string make_positionals(const App *app) const;
128 
130  std::string make_groups(const App *app, AppFormatMode mode) const;
131 
133  virtual std::string make_subcommands(const App *app, AppFormatMode mode) const;
134 
136  virtual std::string make_subcommand(const App *sub) const;
137 
139  virtual std::string make_expanded(const App *sub) const;
140 
142  virtual std::string make_footer(const App *app) const;
143 
145  virtual std::string make_description(const App *app) const;
146 
148  virtual std::string make_usage(const App *app, std::string name) const;
149 
151  std::string make_help(const App * /*app*/, std::string, AppFormatMode) const override;
152 
156 
158  virtual std::string make_option(const Option *opt, bool is_positional) const {
159  std::stringstream out;
161  out, make_option_name(opt, is_positional) + make_option_opts(opt), make_option_desc(opt), column_width_);
162  return out.str();
163  }
164 
166  virtual std::string make_option_name(const Option *, bool) const;
167 
169  virtual std::string make_option_opts(const Option *) const;
170 
172  virtual std::string make_option_desc(const Option *) const;
173 
175  virtual std::string make_option_usage(const Option *opt) const;
176 
178 };
179 
180 } // namespace CLI
Creates a command line program, with very few defaults.
Definition: App.hpp:66
Definition: FormatterFwd.hpp:36
std::size_t column_width_
The width of the first column.
Definition: FormatterFwd.hpp:42
std::map< std::string, std::string > labels_
The required help printout labels (user changeable) Values are Needs, Excludes, etc.
Definition: FormatterFwd.hpp:46
std::size_t get_column_width() const
Get the current column width.
Definition: FormatterFwd.hpp:86
FormatterBase(FormatterBase &&)=default
void label(std::string key, std::string val)
Set the "REQUIRED" label.
Definition: FormatterFwd.hpp:68
std::string get_label(std::string key) const
Get the current value of a name (REQUIRED, etc.)
Definition: FormatterFwd.hpp:78
FormatterBase()=default
FormatterBase(const FormatterBase &)=default
virtual ~FormatterBase() noexcept
Adding a destructor in this form to work around bug in GCC 4.7.
Definition: FormatterFwd.hpp:58
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:71
This is a specialty override for lambda functions.
Definition: FormatterFwd.hpp:92
std::string make_help(const App *app, std::string name, AppFormatMode mode) const override
This will simply call the lambda function.
Definition: FormatterFwd.hpp:106
~FormatterLambda() noexcept override
Adding a destructor (mostly to make GCC 4.7 happy)
Definition: FormatterFwd.hpp:103
FormatterLambda(funct_t funct)
Create a FormatterLambda with a lambda function.
Definition: FormatterFwd.hpp:100
Definition: FormatterFwd.hpp:113
virtual std::string make_description(const App *app) const
This displays the description line.
Definition: Formatter.hpp:64
Formatter(Formatter &&)=default
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:158
virtual std::string make_usage(const App *app, std::string name) const
This displays the usage line.
Definition: Formatter.hpp:90
Formatter(const Formatter &)=default
virtual std::string make_subcommand(const App *sub) const
This prints out a subcommand.
Definition: Formatter.hpp:206
std::string make_help(const App *, std::string, AppFormatMode) const override
This puts everything together.
Definition: Formatter.hpp:140
virtual std::string make_subcommands(const App *app, AppFormatMode mode) const
This prints out all the subcommands.
Definition: Formatter.hpp:164
virtual std::string make_option_opts(const Option *) const
This is the options part of the name, Default: combined into left column.
Definition: Formatter.hpp:236
virtual std::string make_positionals(const App *app) const
This prints out just the positionals "group".
Definition: Formatter.hpp:30
Formatter()=default
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.hpp:267
virtual std::string make_option_name(const Option *, bool) const
This is the name part of an option, Default: left column.
Definition: Formatter.hpp:229
virtual std::string make_footer(const App *app) const
This prints out all the groups of options.
Definition: Formatter.hpp:132
std::string make_groups(const App *app, AppFormatMode mode) const
This prints out all the groups of options.
Definition: Formatter.hpp:40
virtual std::string make_expanded(const App *sub) const
This prints out a subcommand in help-all.
Definition: Formatter.hpp:212
virtual std::string make_group(std::string group, bool is_positional, std::vector< const Option * > opts) const
Definition: Formatter.hpp:19
virtual std::string make_option_usage(const Option *opt) const
This is used to print the name on the USAGE line.
Definition: Formatter.hpp:269
Definition: Option.hpp:231
std::ostream & format_help(std::ostream &out, std::string name, std::string description, std::size_t wid)
Print a two part "help" string.
Definition: StringTools.hpp:158
Definition: App.hpp:32
AppFormatMode
Definition: FormatterFwd.hpp:26
@ Normal
The normal, detailed help.
@ All
A fully expanded help.
@ Sub
Used when printed as part of expanded subcommand.