CLI11 2.2.0
Loading...
Searching...
No Matches
ConfigFwd.hpp
Go to the documentation of this file.
1// Copyright (c) 2017-2022, 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
20namespace CLI {
21// [CLI11:config_fwd_hpp:verbatim]
22
23class App;
24
26struct ConfigItem {
28 std::vector<std::string> parents{};
29
31 std::string name{};
32
34 std::vector<std::string> inputs{};
35
37 std::string fullname() const {
38 std::vector<std::string> tmp = parents;
39 tmp.emplace_back(name);
40 return detail::join(tmp, ".");
41 }
42};
43
45class 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 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());
65 }
66
68 std::vector<ConfigItem> from_file(const std::string &name) {
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
81class 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 }
146 return this;
147 }
149 std::string &sectionRef() { return configSection; }
151 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 int16_t index() const { return configIndex; }
163 ConfigBase *index(int16_t sectionIndex) {
164 configIndex = sectionIndex;
165 return this;
166 }
167};
168
171
173class 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
Creates a command line program, with very few defaults.
Definition App.hpp:85
This converter works with INI/TOML files; to write INI files use ConfigINI.
Definition ConfigFwd.hpp:81
const std::string & section() const
get the section
Definition ConfigFwd.hpp:151
std::vector< ConfigItem > from_config(std::istream &input) const override
Convert a configuration into an app.
Definition Config.hpp:172
std::string configSection
Specify the configuration section that should be used.
Definition ConfigFwd.hpp:104
ConfigBase * comment(char cchar)
Specify the configuration for comment characters.
Definition ConfigFwd.hpp:112
ConfigBase * arrayDelimiter(char aSep)
Specify the delimiter character for an array.
Definition ConfigFwd.hpp:123
char arraySeparator
the character used to separate elements in an array
Definition ConfigFwd.hpp:90
ConfigBase * quoteCharacter(char qString, char qChar)
Specify the quote characters used around strings and characters.
Definition ConfigFwd.hpp:133
std::string & sectionRef()
get a reference to the configuration section
Definition ConfigFwd.hpp:149
ConfigBase * arrayBounds(char aStart, char aEnd)
Specify the start and end characters for an array.
Definition ConfigFwd.hpp:117
std::string to_config(const App *, bool default_also, bool write_description, std::string prefix) const override
Convert an app into a configuration.
Definition Config.hpp:305
int16_t index() const
get the section index
Definition ConfigFwd.hpp:161
ConfigBase * maxLayers(uint8_t layers)
Specify the maximum number of parents.
Definition ConfigFwd.hpp:139
char characterQuote
the character to use around single characters
Definition ConfigFwd.hpp:96
char stringQuote
the character to use around strings
Definition ConfigFwd.hpp:94
ConfigBase * section(const std::string &sectionName)
specify a particular section of the configuration file to use
Definition ConfigFwd.hpp:153
ConfigBase * valueSeparator(char vSep)
Specify the delimiter between a name and value.
Definition ConfigFwd.hpp:128
uint8_t maximumLayers
the maximum number of layers to allow
Definition ConfigFwd.hpp:98
char valueDelimiter
the character used separate the name from the value
Definition ConfigFwd.hpp:92
char arrayStart
the character used to start an array '\0' is a default to not use
Definition ConfigFwd.hpp:86
char parentSeparatorChar
the separator used to separator parent layers
Definition ConfigFwd.hpp:100
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
char arrayEnd
the character used to end an array '\0' is a default to not use
Definition ConfigFwd.hpp:88
ConfigBase * parentSeparator(char sep)
Specify the separator to use for parent layers.
Definition ConfigFwd.hpp:144
int16_t configIndex
Specify the configuration index to use for arrayed sections.
Definition ConfigFwd.hpp:102
char commentChar
the character used for comments
Definition ConfigFwd.hpp:84
ConfigINI generates a "standard" INI compliant output.
Definition ConfigFwd.hpp:173
ConfigINI()
Definition ConfigFwd.hpp:176
This class provides a converter for configuration files.
Definition ConfigFwd.hpp:45
std::vector< ConfigItem > from_file(const std::string &name)
Parse a config file, throw an error (ParseError:ConfigParseError or FileError) on failure.
Definition ConfigFwd.hpp:68
std::vector< ConfigItem > items
Definition ConfigFwd.hpp:47
virtual std::string to_config(const App *, bool, bool, std::string) const =0
Convert an app into a configuration.
virtual ~Config()=default
Virtual destructor.
virtual std::vector< ConfigItem > from_config(std::istream &) const =0
Convert a configuration into an app.
virtual std::string to_flag(const ConfigItem &item) const
Get a flag value.
Definition ConfigFwd.hpp:57
std::string join(const T &v, std::string delim=",")
Simple function to join a string.
Definition StringTools.hpp:63
Definition App.hpp:34
Holds values to load into Options.
Definition ConfigFwd.hpp:26
std::vector< std::string > inputs
Listing of inputs.
Definition ConfigFwd.hpp:34
std::string name
This is the name.
Definition ConfigFwd.hpp:31
std::vector< std::string > parents
This is the list of parents.
Definition ConfigFwd.hpp:28
std::string fullname() const
The list of parents and name joined by ".".
Definition ConfigFwd.hpp:37