CLI11
C++11 Command Line Interface Parser
Loading...
Searching...
No Matches
ConfigFwd.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 <algorithm>
13#include <fstream>
14#include <iostream>
15#include <memory>
16#include <string>
17#include <vector>
18// [CLI11:public_includes:end]
19
20#include "Error.hpp"
21#include "StringTools.hpp"
22
23namespace CLI {
24// [CLI11:config_fwd_hpp:verbatim]
25
26class App;
27
29struct ConfigItem {
31 std::vector<std::string> parents{};
32
34 std::string name{};
36 std::vector<std::string> inputs{};
37
39 CLI11_NODISCARD std::string fullname() const {
40 std::vector<std::string> tmp = parents;
41 tmp.emplace_back(name);
42 return detail::join(tmp, ".");
43 }
44};
45
47class Config {
48 protected:
49 std::vector<ConfigItem> items{};
50
51 public:
53 virtual std::string to_config(const App *, bool, bool, std::string) const = 0;
54
56 virtual std::vector<ConfigItem> from_config(std::istream &) const = 0;
57
59 CLI11_NODISCARD virtual std::string to_flag(const ConfigItem &item) const {
60 if(item.inputs.size() == 1) {
61 return item.inputs.at(0);
62 }
63 if(item.inputs.empty()) {
64 return "{}";
65 }
66 throw ConversionError::TooManyInputsFlag(item.fullname()); // LCOV_EXCL_LINE
67 }
68
70 CLI11_NODISCARD std::vector<ConfigItem> from_file(const std::string &name) const {
71 std::ifstream input{name};
72 if(!input.good())
73 throw FileError::Missing(name);
74
75 return from_config(input);
76 }
77
79 virtual ~Config() = default;
80};
81
83class ConfigBase : public Config {
84 protected:
86 char commentChar = '#';
88 char arrayStart = '[';
90 char arrayEnd = ']';
92 char arraySeparator = ',';
94 char valueDelimiter = '=';
96 char stringQuote = '"';
98 char literalQuote = '\'';
100 uint8_t maximumLayers{255};
104 int16_t configIndex{-1};
106 std::string configSection{};
107
108 public:
109 std::string
110 to_config(const App * /*app*/, bool default_also, bool write_description, std::string prefix) const override;
111
112 std::vector<ConfigItem> from_config(std::istream &input) const override;
114 ConfigBase *comment(char cchar) {
115 commentChar = cchar;
116 return this;
117 }
119 ConfigBase *arrayBounds(char aStart, char aEnd) {
120 arrayStart = aStart;
121 arrayEnd = aEnd;
122 return this;
123 }
126 arraySeparator = aSep;
127 return this;
128 }
131 valueDelimiter = vSep;
132 return this;
133 }
135 ConfigBase *quoteCharacter(char qString, char literalChar) {
136 stringQuote = qString;
137 literalQuote = literalChar;
138 return this;
139 }
141 ConfigBase *maxLayers(uint8_t layers) {
142 maximumLayers = layers;
143 return this;
144 }
148 return this;
149 }
151 std::string &sectionRef() { return configSection; }
153 CLI11_NODISCARD const std::string &section() const { return configSection; }
155 ConfigBase *section(const std::string &sectionName) {
156 configSection = sectionName;
157 return this;
158 }
159
161 int16_t &indexRef() { return configIndex; }
163 CLI11_NODISCARD int16_t index() const { return configIndex; }
165 ConfigBase *index(int16_t sectionIndex) {
166 configIndex = sectionIndex;
167 return this;
168 }
169};
170
172using ConfigTOML = ConfigBase;
173
175class ConfigINI : public ConfigTOML {
176
177 public:
178 ConfigINI() {
179 commentChar = ';';
180 arrayStart = '\0';
181 arrayEnd = '\0';
182 arraySeparator = ' ';
183 valueDelimiter = '=';
184 }
185};
186// [CLI11:config_fwd_hpp:end]
187} // namespace CLI
Creates a command line program, with very few defaults.
Definition App.hpp:90
This converter works with INI/TOML files; to write INI files use ConfigINI.
Definition ConfigFwd.hpp:83
std::vector< ConfigItem > from_config(std::istream &input) const override
Convert a configuration into an app.
std::string configSection
Specify the configuration section that should be used.
Definition ConfigFwd.hpp:106
ConfigBase * comment(char cchar)
Specify the configuration for comment characters.
Definition ConfigFwd.hpp:114
ConfigBase * arrayDelimiter(char aSep)
Specify the delimiter character for an array.
Definition ConfigFwd.hpp:125
ConfigBase * quoteCharacter(char qString, char literalChar)
Specify the quote characters used around strings and literal strings.
Definition ConfigFwd.hpp:135
char arraySeparator
the character used to separate elements in an array
Definition ConfigFwd.hpp:92
std::string & sectionRef()
get a reference to the configuration section
Definition ConfigFwd.hpp:151
ConfigBase * arrayBounds(char aStart, char aEnd)
Specify the start and end characters for an array.
Definition ConfigFwd.hpp:119
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:141
CLI11_NODISCARD const std::string & section() const
get the section
Definition ConfigFwd.hpp:153
char stringQuote
the character to use around strings
Definition ConfigFwd.hpp:96
ConfigBase * section(const std::string &sectionName)
specify a particular section of the configuration file to use
Definition ConfigFwd.hpp:155
ConfigBase * valueSeparator(char vSep)
Specify the delimiter between a name and value.
Definition ConfigFwd.hpp:130
uint8_t maximumLayers
the maximum number of layers to allow
Definition ConfigFwd.hpp:100
char valueDelimiter
the character used separate the name from the value
Definition ConfigFwd.hpp:94
char arrayStart
the character used to start an array '\0' is a default to not use
Definition ConfigFwd.hpp:88
char parentSeparatorChar
the separator used to separator parent layers
Definition ConfigFwd.hpp:102
CLI11_NODISCARD int16_t index() const
get the section index
Definition ConfigFwd.hpp:163
char literalQuote
the character to use around single characters and literal strings
Definition ConfigFwd.hpp:98
ConfigBase * index(int16_t sectionIndex)
specify a particular index in the section to use (-1) for all sections to use
Definition ConfigFwd.hpp:165
int16_t & indexRef()
get a reference to the configuration index
Definition ConfigFwd.hpp:161
char arrayEnd
the character used to end an array '\0' is a default to not use
Definition ConfigFwd.hpp:90
ConfigBase * parentSeparator(char sep)
Specify the separator to use for parent layers.
Definition ConfigFwd.hpp:146
int16_t configIndex
Specify the configuration index to use for arrayed sections.
Definition ConfigFwd.hpp:104
char commentChar
the character used for comments
Definition ConfigFwd.hpp:86
This class provides a converter for configuration files.
Definition ConfigFwd.hpp:47
virtual CLI11_NODISCARD std::string to_flag(const ConfigItem &item) const
Get a flag value.
Definition ConfigFwd.hpp:59
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:70
virtual ~Config()=default
Virtual destructor.
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:175
Holds values to load into Options.
Definition ConfigFwd.hpp:29
std::vector< std::string > inputs
Listing of inputs.
Definition ConfigFwd.hpp:36
std::string name
This is the name.
Definition ConfigFwd.hpp:34
CLI11_NODISCARD std::string fullname() const
The list of parents and name joined by ".".
Definition ConfigFwd.hpp:39
std::vector< std::string > parents
This is the list of parents.
Definition ConfigFwd.hpp:31