CLI11  2.6.2
ConfigFwd.hpp
Go to the documentation of this file.
1 // Copyright (c) 2017-2026, 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 <algorithm>
13 #include <fstream>
14 #include <iostream>
15 #include <memory>
16 #include <string>
17 #include <vector>
18 // [CLI11:public_includes:end]
19 #include "Encoding.hpp"
20 #include "Error.hpp"
21 #include "StringTools.hpp"
22 
23 namespace CLI {
24 // [CLI11:config_fwd_hpp:verbatim]
25 
26 class App;
27 
29 struct ConfigItem {
31  std::vector<std::string> parents{};
32 
34  std::string name{};
36  std::vector<std::string> inputs{};
38  bool multiline{false};
40  CLI11_NODISCARD std::string fullname() const {
41  std::vector<std::string> tmp = parents;
42  tmp.emplace_back(name);
43  return detail::join(tmp, ".");
44  (void)multiline; // suppression for cppcheck false positive
45  }
46 };
47 
49 class Config {
50  protected:
51  std::vector<ConfigItem> items{};
52 
53  public:
55  virtual std::string to_config(const App *, bool, bool, std::string) const = 0;
56 
58  virtual std::vector<ConfigItem> from_config(std::istream &) const = 0;
59 
61  CLI11_NODISCARD virtual std::string to_flag(const ConfigItem &item) const {
62  if(item.inputs.size() == 1) {
63  return item.inputs.at(0);
64  }
65  if(item.inputs.empty()) {
66  return "{}";
67  }
68  throw ConversionError::TooManyInputsFlag(item.fullname()); // LCOV_EXCL_LINE
69  }
70 
72  CLI11_NODISCARD std::vector<ConfigItem> from_file(const std::string &name) const {
73 #if defined CLI11_HAS_FILESYSTEM && CLI11_HAS_FILESYSTEM > 0
74  std::ifstream input{to_path(name)};
75 #else
76  std::ifstream input{name};
77 #endif
78 
79  if(!input.good())
80  throw FileError::Missing(name);
81 
82  return from_config(input);
83  }
84 
86  virtual ~Config() = default;
87 };
88 
90 class ConfigBase : public Config {
91  protected:
93  char commentChar = '#';
95  char arrayStart = '[';
97  char arrayEnd = ']';
99  char arraySeparator = ',';
101  char valueDelimiter = '=';
103  char stringQuote = '"';
105  char literalQuote = '\'';
107  uint8_t maximumLayers{255};
111  bool commentDefaultsBool = false;
115  int16_t configIndex{-1};
117  std::string configSection{};
118 
119  public:
120  std::string
121  to_config(const App * /*app*/, bool default_also, bool write_description, std::string prefix) const override;
122 
123  std::vector<ConfigItem> from_config(std::istream &input) const override;
125  ConfigBase *comment(char cchar) {
126  commentChar = cchar;
127  return this;
128  }
130  ConfigBase *arrayBounds(char aStart, char aEnd) {
131  arrayStart = aStart;
132  arrayEnd = aEnd;
133  return this;
134  }
137  arraySeparator = aSep;
138  return this;
139  }
142  valueDelimiter = vSep;
143  return this;
144  }
146  ConfigBase *quoteCharacter(char qString, char literalChar) {
147  stringQuote = qString;
148  literalQuote = literalChar;
149  return this;
150  }
152  ConfigBase *maxLayers(uint8_t layers) {
153  maximumLayers = layers;
154  return this;
155  }
158  parentSeparatorChar = sep;
159  return this;
160  }
162  ConfigBase *commentDefaults(bool comDef = true) {
163  commentDefaultsBool = comDef;
164  return this;
165  }
167  std::string &sectionRef() { return configSection; }
169  CLI11_NODISCARD const std::string &section() const { return configSection; }
171  ConfigBase *section(const std::string &sectionName) {
172  configSection = sectionName;
173  return this;
174  }
175 
177  int16_t &indexRef() { return configIndex; }
179  CLI11_NODISCARD int16_t index() const { return configIndex; }
181  ConfigBase *index(int16_t sectionIndex) {
182  configIndex = sectionIndex;
183  return this;
184  }
186  ConfigBase *allowDuplicateFields(bool value = true) {
188  return this;
189  }
190 };
191 
194 
196 class ConfigINI : public ConfigTOML {
197 
198  public:
200  commentChar = ';';
201  arrayStart = '\0';
202  arrayEnd = '\0';
203  arraySeparator = ' ';
204  valueDelimiter = '=';
205  }
206 };
207 // [CLI11:config_fwd_hpp:end]
208 } // namespace CLI
This class provides a converter for configuration files.
Definition: ConfigFwd.hpp:49
char arrayEnd
the character used to end an array '\0' is a default to not use
Definition: ConfigFwd.hpp:97
Definition: App.hpp:36
uint8_t maximumLayers
the maximum number of layers to allow
Definition: ConfigFwd.hpp:107
int16_t configIndex
Specify the configuration index to use for arrayed sections.
Definition: ConfigFwd.hpp:115
std::vector< std::string > parents
This is the list of parents.
Definition: ConfigFwd.hpp:31
ConfigBase * comment(char cchar)
Specify the configuration for comment characters.
Definition: ConfigFwd.hpp:125
ConfigBase * allowDuplicateFields(bool value=true)
specify that multiple duplicate arguments should be merged even if not sequential ...
Definition: ConfigFwd.hpp:186
virtual std::vector< ConfigItem > from_config(std::istream &) const =0
Convert a configuration into an app.
CLI11_NODISCARD std::vector< ConfigItem > from_file(const std::string &name) const
Parse a config file, throw an error (ParseError:ConfigParseError or FileError) on failure...
Definition: ConfigFwd.hpp:72
char arrayStart
the character used to start an array '\0' is a default to not use
Definition: ConfigFwd.hpp:95
ConfigINI generates a "standard" INI compliant output.
Definition: ConfigFwd.hpp:196
bool allowMultipleDuplicateFields
specify the config reader should collapse repeated field names to a single vector ...
Definition: ConfigFwd.hpp:113
char literalQuote
the character to use around single characters and literal strings
Definition: ConfigFwd.hpp:105
std::vector< ConfigItem > from_config(std::istream &input) const override
Convert a configuration into an app.
ConfigBase * section(const std::string &sectionName)
specify a particular section of the configuration file to use
Definition: ConfigFwd.hpp:171
std::string name
This is the name.
Definition: ConfigFwd.hpp:34
virtual CLI11_NODISCARD std::string to_flag(const ConfigItem &item) const
Get a flag value.
Definition: ConfigFwd.hpp:61
ConfigBase * arrayDelimiter(char aSep)
Specify the delimiter character for an array.
Definition: ConfigFwd.hpp:136
ConfigBase * commentDefaults(bool comDef=true)
comment default value options
Definition: ConfigFwd.hpp:162
char valueDelimiter
the character used separate the name from the value
Definition: ConfigFwd.hpp:101
ConfigBase * quoteCharacter(char qString, char literalChar)
Specify the quote characters used around strings and literal strings.
Definition: ConfigFwd.hpp:146
CLI11_NODISCARD const std::string & section() const
get the section
Definition: ConfigFwd.hpp:169
CLI11_NODISCARD std::string fullname() const
The list of parents and name joined by ".".
Definition: ConfigFwd.hpp:40
std::string join(const T &v, std::string delim=",")
Simple function to join a string.
Definition: StringTools.hpp:54
bool commentDefaultsBool
comment default values
Definition: ConfigFwd.hpp:111
std::vector< std::string > inputs
Listing of inputs.
Definition: ConfigFwd.hpp:36
std::vector< ConfigItem > items
Definition: ConfigFwd.hpp:51
ConfigINI()
Definition: ConfigFwd.hpp:199
ConfigBase * arrayBounds(char aStart, char aEnd)
Specify the start and end characters for an array.
Definition: ConfigFwd.hpp:130
std::string configSection
Specify the configuration section that should be used.
Definition: ConfigFwd.hpp:117
ConfigBase * valueSeparator(char vSep)
Specify the delimiter between a name and value.
Definition: ConfigFwd.hpp:141
virtual std::string to_config(const App *, bool, bool, std::string) const =0
Convert an app into a configuration.
#define CLI11_NODISCARD
Definition: Macros.hpp:58
virtual ~Config()=default
Virtual destructor.
char commentChar
the character used for comments
Definition: ConfigFwd.hpp:93
CLI11_NODISCARD int16_t index() const
get the section index
Definition: ConfigFwd.hpp:179
ConfigBase * maxLayers(uint8_t layers)
Specify the maximum number of parents.
Definition: ConfigFwd.hpp:152
ConfigBase * index(int16_t sectionIndex)
specify a particular index in the section to use (-1) for all sections to use
Definition: ConfigFwd.hpp:181
std::string to_config(const App *, bool default_also, bool write_description, std::string prefix) const override
Convert an app into a configuration.
int16_t & indexRef()
get a reference to the configuration index
Definition: ConfigFwd.hpp:177
Holds values to load into Options.
Definition: ConfigFwd.hpp:29
ConfigBase * parentSeparator(char sep)
Specify the separator to use for parent layers.
Definition: ConfigFwd.hpp:157
Creates a command line program, with very few defaults.
Definition: App.hpp:115
char parentSeparatorChar
the separator used to separator parent layers
Definition: ConfigFwd.hpp:109
This converter works with INI/TOML files; to write INI files use ConfigINI.
Definition: ConfigFwd.hpp:90
std::string & sectionRef()
get a reference to the configuration section
Definition: ConfigFwd.hpp:167
bool multiline
indicator if a multiline vector separator was inserted
Definition: ConfigFwd.hpp:38
char arraySeparator
the character used to separate elements in an array
Definition: ConfigFwd.hpp:99
char stringQuote
the character to use around strings
Definition: ConfigFwd.hpp:103