CLI11
C++11 Command Line Interface Parser
Loading...
Searching...
No Matches
ConfigFwd.hpp
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 <cstdint>
14#include <fstream>
15#include <iostream>
16#include <memory>
17#include <string>
18#include <utility>
19#include <vector>
20// [CLI11:public_includes:end]
21#include "Encoding.hpp"
22#include "Error.hpp"
23#include "StringTools.hpp"
24
25namespace CLI {
26// [CLI11:config_fwd_hpp:verbatim]
27
28class App;
29
31enum class ConfigOutputMode : std::uint8_t { Active = 0, AllDefaults, ActiveSubcommandDefaults };
32
34struct ConfigItem {
36 std::vector<std::string> parents{};
37
39 std::string name{};
41 std::vector<std::string> inputs{};
43 bool multiline{false};
45 CLI11_NODISCARD std::string fullname() const {
46 std::vector<std::string> tmp = parents;
47 tmp.emplace_back(name);
48 return detail::join(tmp, ".");
49 (void)multiline; // suppression for cppcheck false positive
50 }
51};
52
54class Config {
55 protected:
56 std::vector<ConfigItem> items{};
57
58 public:
60 virtual std::string to_config(const App *, bool, bool, std::string) const = 0;
61
63 virtual std::string
64 to_config(const App *app, ConfigOutputMode mode, bool write_description, std::string prefix) const {
65 return to_config(app, mode != ConfigOutputMode::Active, write_description, std::move(prefix));
66 }
67
69 virtual std::vector<ConfigItem> from_config(std::istream &) const = 0;
70
72 CLI11_NODISCARD virtual std::string to_flag(const ConfigItem &item) const {
73 if(item.inputs.size() == 1) {
74 return item.inputs.at(0);
75 }
76 if(item.inputs.empty()) {
77 return "{}";
78 }
79 throw ConversionError::TooManyInputsFlag(item.fullname()); // LCOV_EXCL_LINE
80 }
81
83 CLI11_NODISCARD std::vector<ConfigItem> from_file(const std::string &name) const {
84#if defined CLI11_HAS_FILESYSTEM && CLI11_HAS_FILESYSTEM > 0
85 std::ifstream input{to_path(name)};
86#else
87 std::ifstream input{name};
88#endif
89
90 if(!input.good())
91 throw FileError::Missing(name);
92
93 return from_config(input);
94 }
95
97 virtual ~Config() = default;
98};
99
101class ConfigBase : public Config {
102 protected:
104 char commentChar = '#';
106 char arrayStart = '[';
108 char arrayEnd = ']';
110 char arraySeparator = ',';
112 char valueDelimiter = '=';
114 char stringQuote = '"';
116 char literalQuote = '\'';
118 uint8_t maximumLayers{255};
126 int16_t configIndex{-1};
128 std::string configSection{};
129
130 public:
131 std::string
132 to_config(const App * /*app*/, ConfigOutputMode mode, bool write_description, std::string prefix) const override;
133
134 std::string
135 to_config(const App * /*app*/, bool default_also, bool write_description, std::string prefix) const override;
136
137 std::vector<ConfigItem> from_config(std::istream &input) const override;
139 ConfigBase *comment(char cchar) {
140 commentChar = cchar;
141 return this;
142 }
144 ConfigBase *arrayBounds(char aStart, char aEnd) {
145 arrayStart = aStart;
146 arrayEnd = aEnd;
147 return this;
148 }
151 arraySeparator = aSep;
152 return this;
153 }
156 valueDelimiter = vSep;
157 return this;
158 }
160 ConfigBase *quoteCharacter(char qString, char literalChar) {
161 stringQuote = qString;
162 literalQuote = literalChar;
163 return this;
164 }
166 ConfigBase *maxLayers(uint8_t layers) {
167 maximumLayers = layers;
168 return this;
169 }
173 return this;
174 }
176 ConfigBase *commentDefaults(bool comDef = true) {
177 commentDefaultsBool = comDef;
178 return this;
179 }
181 std::string &sectionRef() { return configSection; }
183 CLI11_NODISCARD const std::string &section() const { return configSection; }
185 ConfigBase *section(const std::string &sectionName) {
186 configSection = sectionName;
187 return this;
188 }
189
191 int16_t &indexRef() { return configIndex; }
193 CLI11_NODISCARD int16_t index() const { return configIndex; }
195 ConfigBase *index(int16_t sectionIndex) {
196 configIndex = sectionIndex;
197 return this;
198 }
200 ConfigBase *allowDuplicateFields(bool value = true) {
202 return this;
203 }
204};
205
207using ConfigTOML = ConfigBase;
208
210class ConfigINI : public ConfigTOML {
211
212 public:
213 ConfigINI() {
214 commentChar = ';';
215 arrayStart = '\0';
216 arrayEnd = '\0';
217 arraySeparator = ' ';
218 valueDelimiter = '=';
219 }
220};
221// [CLI11:config_fwd_hpp:end]
222} // namespace CLI
Creates a command line program, with very few defaults.
Definition App.hpp:115
This converter works with INI/TOML files; to write INI files use ConfigINI.
Definition ConfigFwd.hpp:101
std::vector< ConfigItem > from_config(std::istream &input) const override
Convert a configuration into an app.
Definition Config_inl.hpp:240
std::string configSection
Specify the configuration section that should be used.
Definition ConfigFwd.hpp:128
ConfigBase * comment(char cchar)
Specify the configuration for comment characters.
Definition ConfigFwd.hpp:139
ConfigBase * arrayDelimiter(char aSep)
Specify the delimiter character for an array.
Definition ConfigFwd.hpp:150
std::string to_config(const App *, ConfigOutputMode mode, bool write_description, std::string prefix) const override
Convert an app into a configuration.
ConfigBase * quoteCharacter(char qString, char literalChar)
Specify the quote characters used around strings and literal strings.
Definition ConfigFwd.hpp:160
char arraySeparator
the character used to separate elements in an array
Definition ConfigFwd.hpp:110
std::string & sectionRef()
get a reference to the configuration section
Definition ConfigFwd.hpp:181
ConfigBase * arrayBounds(char aStart, char aEnd)
Specify the start and end characters for an array.
Definition ConfigFwd.hpp:144
std::string to_config(const App *, bool default_also, bool write_description, std::string prefix) const override
Convert an app into a configuration.
ConfigBase * maxLayers(uint8_t layers)
Specify the maximum number of parents.
Definition ConfigFwd.hpp:166
ConfigBase * allowDuplicateFields(bool value=true)
specify that multiple duplicate arguments should be merged even if not sequential
Definition ConfigFwd.hpp:200
CLI11_NODISCARD const std::string & section() const
get the section
Definition ConfigFwd.hpp:183
ConfigBase * commentDefaults(bool comDef=true)
comment default value options
Definition ConfigFwd.hpp:176
char stringQuote
the character to use around strings
Definition ConfigFwd.hpp:114
ConfigBase * section(const std::string &sectionName)
specify a particular section of the configuration file to use
Definition ConfigFwd.hpp:185
ConfigBase * valueSeparator(char vSep)
Specify the delimiter between a name and value.
Definition ConfigFwd.hpp:155
uint8_t maximumLayers
the maximum number of layers to allow
Definition ConfigFwd.hpp:118
char valueDelimiter
the character used separate the name from the value
Definition ConfigFwd.hpp:112
char arrayStart
the character used to start an array '\0' is a default to not use
Definition ConfigFwd.hpp:106
char parentSeparatorChar
the separator used to separator parent layers
Definition ConfigFwd.hpp:120
bool allowMultipleDuplicateFields
specify the config reader should collapse repeated field names to a single vector
Definition ConfigFwd.hpp:124
CLI11_NODISCARD int16_t index() const
get the section index
Definition ConfigFwd.hpp:193
char literalQuote
the character to use around single characters and literal strings
Definition ConfigFwd.hpp:116
ConfigBase * index(int16_t sectionIndex)
specify a particular index in the section to use (-1) for all sections to use
Definition ConfigFwd.hpp:195
int16_t & indexRef()
get a reference to the configuration index
Definition ConfigFwd.hpp:191
char arrayEnd
the character used to end an array '\0' is a default to not use
Definition ConfigFwd.hpp:108
ConfigBase * parentSeparator(char sep)
Specify the separator to use for parent layers.
Definition ConfigFwd.hpp:171
bool commentDefaultsBool
comment default values
Definition ConfigFwd.hpp:122
int16_t configIndex
Specify the configuration index to use for arrayed sections.
Definition ConfigFwd.hpp:126
char commentChar
the character used for comments
Definition ConfigFwd.hpp:104
This class provides a converter for configuration files.
Definition ConfigFwd.hpp:54
virtual CLI11_NODISCARD std::string to_flag(const ConfigItem &item) const
Get a flag value.
Definition ConfigFwd.hpp:72
virtual std::string to_config(const App *, bool, bool, std::string) const =0
Convert an app into a configuration.
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:83
virtual ~Config()=default
Virtual destructor.
virtual std::string to_config(const App *app, ConfigOutputMode mode, bool write_description, std::string prefix) const
Convert an app into a configuration.
Definition ConfigFwd.hpp:64
virtual std::vector< ConfigItem > from_config(std::istream &) const =0
Convert a configuration into an app.
ConfigINI generates a "standard" INI compliant output.
Definition ConfigFwd.hpp:210
Holds values to load into Options.
Definition ConfigFwd.hpp:34
std::vector< std::string > inputs
Listing of inputs.
Definition ConfigFwd.hpp:41
std::string name
This is the name.
Definition ConfigFwd.hpp:39
CLI11_NODISCARD std::string fullname() const
The list of parents and name joined by ".".
Definition ConfigFwd.hpp:45
bool multiline
indicator if a multiline vector separator was inserted
Definition ConfigFwd.hpp:43
std::vector< std::string > parents
This is the list of parents.
Definition ConfigFwd.hpp:36