CLI11  2.3.2
ConfigFwd.hpp
Go to the documentation of this file.
1 // Copyright (c) 2017-2023, 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 // [CLI11:public_includes:set]
10 #include <algorithm>
11 #include <fstream>
12 #include <iostream>
13 #include <string>
14 #include <vector>
15 // [CLI11:public_includes:end]
16 
17 #include "Error.hpp"
18 #include "StringTools.hpp"
19 
20 namespace CLI {
21 // [CLI11:config_fwd_hpp:verbatim]
22 
23 class App;
24 
26 struct ConfigItem {
28  std::vector<std::string> parents{};
29 
31  std::string name{};
32 
34  std::vector<std::string> inputs{};
35 
37  CLI11_NODISCARD std::string fullname() const {
38  std::vector<std::string> tmp = parents;
39  tmp.emplace_back(name);
40  return detail::join(tmp, ".");
41  }
42 };
43 
45 class Config {
46  protected:
47  std::vector<ConfigItem> items{};
48 
49  public:
51  virtual std::string to_config(const App *, bool, bool, std::string) const = 0;
52 
54  virtual std::vector<ConfigItem> from_config(std::istream &) const = 0;
55 
57  CLI11_NODISCARD virtual std::string to_flag(const ConfigItem &item) const {
58  if(item.inputs.size() == 1) {
59  return item.inputs.at(0);
60  }
61  if(item.inputs.empty()) {
62  return "{}";
63  }
64  throw ConversionError::TooManyInputsFlag(item.fullname()); // LCOV_EXCL_LINE
65  }
66 
68  CLI11_NODISCARD std::vector<ConfigItem> from_file(const std::string &name) const {
69  std::ifstream input{name};
70  if(!input.good())
71  throw FileError::Missing(name);
72 
73  return from_config(input);
74  }
75 
77  virtual ~Config() = default;
78 };
79 
81 class ConfigBase : public Config {
82  protected:
84  char commentChar = '#';
86  char arrayStart = '[';
88  char arrayEnd = ']';
90  char arraySeparator = ',';
92  char valueDelimiter = '=';
94  char stringQuote = '"';
96  char characterQuote = '\'';
98  uint8_t maximumLayers{255};
102  int16_t configIndex{-1};
104  std::string configSection{};
105 
106  public:
107  std::string
108  to_config(const App * /*app*/, bool default_also, bool write_description, std::string prefix) const override;
109 
110  std::vector<ConfigItem> from_config(std::istream &input) const override;
112  ConfigBase *comment(char cchar) {
113  commentChar = cchar;
114  return this;
115  }
117  ConfigBase *arrayBounds(char aStart, char aEnd) {
118  arrayStart = aStart;
119  arrayEnd = aEnd;
120  return this;
121  }
124  arraySeparator = aSep;
125  return this;
126  }
129  valueDelimiter = vSep;
130  return this;
131  }
133  ConfigBase *quoteCharacter(char qString, char qChar) {
134  stringQuote = qString;
135  characterQuote = qChar;
136  return this;
137  }
139  ConfigBase *maxLayers(uint8_t layers) {
140  maximumLayers = layers;
141  return this;
142  }
145  parentSeparatorChar = sep;
146  return this;
147  }
149  std::string &sectionRef() { return configSection; }
151  CLI11_NODISCARD const std::string &section() const { return configSection; }
153  ConfigBase *section(const std::string &sectionName) {
154  configSection = sectionName;
155  return this;
156  }
157 
159  int16_t &indexRef() { return configIndex; }
161  CLI11_NODISCARD int16_t index() const { return configIndex; }
163  ConfigBase *index(int16_t sectionIndex) {
164  configIndex = sectionIndex;
165  return this;
166  }
167 };
168 
171 
173 class ConfigINI : public ConfigTOML {
174 
175  public:
177  commentChar = ';';
178  arrayStart = '\0';
179  arrayEnd = '\0';
180  arraySeparator = ' ';
181  valueDelimiter = '=';
182  }
183 };
184 // [CLI11:config_fwd_hpp:end]
185 } // namespace CLI
This class provides a converter for configuration files.
Definition: ConfigFwd.hpp:45
char arrayEnd
the character used to end an array &#39;\0&#39; is a default to not use
Definition: ConfigFwd.hpp:88
Definition: App.hpp:34
uint8_t maximumLayers
the maximum number of layers to allow
Definition: ConfigFwd.hpp:98
int16_t configIndex
Specify the configuration index to use for arrayed sections.
Definition: ConfigFwd.hpp:102
std::vector< std::string > parents
This is the list of parents.
Definition: ConfigFwd.hpp:28
ConfigBase * comment(char cchar)
Specify the configuration for comment characters.
Definition: ConfigFwd.hpp:112
char arrayStart
the character used to start an array &#39;\0&#39; is a default to not use
Definition: ConfigFwd.hpp:86
ConfigINI generates a "standard" INI compliant output.
Definition: ConfigFwd.hpp:173
ConfigBase * section(const std::string &sectionName)
specify a particular section of the configuration file to use
Definition: ConfigFwd.hpp:153
std::string name
This is the name.
Definition: ConfigFwd.hpp:31
ConfigBase * arrayDelimiter(char aSep)
Specify the delimiter character for an array.
Definition: ConfigFwd.hpp:123
char valueDelimiter
the character used separate the name from the value
Definition: ConfigFwd.hpp:92
CLI11_NODISCARD int16_t index() const
get the section index
Definition: ConfigFwd.hpp:161
std::string join(const T &v, std::string delim=",")
Simple function to join a string.
Definition: StringTools.hpp:51
ConfigBase * quoteCharacter(char qString, char qChar)
Specify the quote characters used around strings and characters.
Definition: ConfigFwd.hpp:133
CLI11_NODISCARD const std::string & section() const
get the section
Definition: ConfigFwd.hpp:151
std::vector< std::string > inputs
Listing of inputs.
Definition: ConfigFwd.hpp:34
std::vector< ConfigItem > items
Definition: ConfigFwd.hpp:47
virtual CLI11_NODISCARD std::string to_flag(const ConfigItem &item) const
Get a flag value.
Definition: ConfigFwd.hpp:57
std::string to_config(const App *, bool default_also, bool write_description, std::string prefix) const override
Convert an app into a configuration.
ConfigINI()
Definition: ConfigFwd.hpp:176
ConfigBase * arrayBounds(char aStart, char aEnd)
Specify the start and end characters for an array.
Definition: ConfigFwd.hpp:117
std::string configSection
Specify the configuration section that should be used.
Definition: ConfigFwd.hpp:104
ConfigBase * valueSeparator(char vSep)
Specify the delimiter between a name and value.
Definition: ConfigFwd.hpp:128
char characterQuote
the character to use around single characters
Definition: ConfigFwd.hpp:96
#define CLI11_NODISCARD
Definition: Macros.hpp:47
virtual ~Config()=default
Virtual destructor.
virtual std::vector< ConfigItem > from_config(std::istream &) const =0
Convert a configuration into an app.
char commentChar
the character used for comments
Definition: ConfigFwd.hpp:84
ConfigBase * maxLayers(uint8_t layers)
Specify the maximum number of parents.
Definition: ConfigFwd.hpp:139
ConfigBase * index(int16_t sectionIndex)
specify a particular index in the section to use (-1) for all sections to use
Definition: ConfigFwd.hpp:163
int16_t & indexRef()
get a reference to the configuration index
Definition: ConfigFwd.hpp:159
Holds values to load into Options.
Definition: ConfigFwd.hpp:26
std::vector< ConfigItem > from_config(std::istream &input) const override
Convert a configuration into an app.
ConfigBase * parentSeparator(char sep)
Specify the separator to use for parent layers.
Definition: ConfigFwd.hpp:144
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:68
Creates a command line program, with very few defaults.
Definition: App.hpp:88
char parentSeparatorChar
the separator used to separator parent layers
Definition: ConfigFwd.hpp:100
CLI11_NODISCARD std::string fullname() const
The list of parents and name joined by ".".
Definition: ConfigFwd.hpp:37
This converter works with INI/TOML files; to write INI files use ConfigINI.
Definition: ConfigFwd.hpp:81
virtual std::string to_config(const App *, bool, bool, std::string) const =0
Convert an app into a configuration.
std::string & sectionRef()
get a reference to the configuration section
Definition: ConfigFwd.hpp:149
char arraySeparator
the character used to separate elements in an array
Definition: ConfigFwd.hpp:90
char stringQuote
the character to use around strings
Definition: ConfigFwd.hpp:94