CLI11  1.9.1
ConfigFwd.hpp
Go to the documentation of this file.
1 // Copyright (c) 2017-2020, 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 #include <algorithm>
10 #include <fstream>
11 #include <iostream>
12 #include <string>
13 #include <vector>
14 
15 #include "Error.hpp"
16 #include "StringTools.hpp"
17 
18 namespace CLI {
19 
20 class App;
21 
23 struct ConfigItem {
25  std::vector<std::string> parents{};
26 
28  std::string name{};
29 
31  std::vector<std::string> inputs{};
32 
34  std::string fullname() const {
35  std::vector<std::string> tmp = parents;
36  tmp.emplace_back(name);
37  return detail::join(tmp, ".");
38  }
39 };
40 
42 class Config {
43  protected:
44  std::vector<ConfigItem> items{};
45 
46  public:
48  virtual std::string to_config(const App *, bool, bool, std::string) const = 0;
49 
51  virtual std::vector<ConfigItem> from_config(std::istream &) const = 0;
52 
54  virtual std::string to_flag(const ConfigItem &item) const {
55  if(item.inputs.size() == 1) {
56  return item.inputs.at(0);
57  }
58  throw ConversionError::TooManyInputsFlag(item.fullname());
59  }
60 
62  std::vector<ConfigItem> from_file(const std::string &name) {
63  std::ifstream input{name};
64  if(!input.good())
65  throw FileError::Missing(name);
66 
67  return from_config(input);
68  }
69 
71  virtual ~Config() = default;
72 };
73 
75 class ConfigBase : public Config {
76  protected:
78  char commentChar = ';';
80  char arrayStart = '\0';
82  char arrayEnd = '\0';
84  char arraySeparator = ' ';
86  char valueDelimiter = '=';
87 
88  public:
89  std::string
90  to_config(const App * /*app*/, bool default_also, bool write_description, std::string prefix) const override;
91 
92  std::vector<ConfigItem> from_config(std::istream &input) const override;
94  ConfigBase *comment(char cchar) {
95  commentChar = cchar;
96  return this;
97  }
99  ConfigBase *arrayBounds(char aStart, char aEnd) {
100  arrayStart = aStart;
101  arrayEnd = aEnd;
102  return this;
103  }
106  arraySeparator = aSep;
107  return this;
108  }
111  valueDelimiter = vSep;
112  return this;
113  }
114 };
115 
118 
120 class ConfigTOML : public ConfigINI {
121 
122  public:
124  commentChar = '#';
125  arrayStart = '[';
126  arrayEnd = ']';
127  arraySeparator = ',';
128  valueDelimiter = '=';
129  }
130 };
131 } // namespace CLI
CLI::ConfigBase::arrayEnd
char arrayEnd
the character used to end an array '\0' is a default to not use
Definition: ConfigFwd.hpp:82
CLI::ConfigItem::name
std::string name
This is the name.
Definition: ConfigFwd.hpp:28
CLI::Config::to_flag
virtual std::string to_flag(const ConfigItem &item) const
Get a flag value.
Definition: ConfigFwd.hpp:54
Error.hpp
CLI::ConfigBase::comment
ConfigBase * comment(char cchar)
Specify the configuration for comment characters.
Definition: ConfigFwd.hpp:94
CLI::detail::join
std::string join(const T &v, std::string delim=",")
Simple function to join a string.
Definition: StringTools.hpp:59
CLI::ConfigItem::fullname
std::string fullname() const
The list of parents and name joined by ".".
Definition: ConfigFwd.hpp:34
CLI::Config::~Config
virtual ~Config()=default
Virtual destructor.
CLI::ConfigBase::arrayDelimiter
ConfigBase * arrayDelimiter(char aSep)
Specify the delimiter character for an array.
Definition: ConfigFwd.hpp:105
CLI::ConfigBase
This converter works with INI/TOML files; to write proper TOML files use ConfigTOML.
Definition: ConfigFwd.hpp:75
CLI::ConfigBase::arrayStart
char arrayStart
the character used to start an array '\0' is a default to not use
Definition: ConfigFwd.hpp:80
CLI
Definition: App.hpp:32
CLI::ConfigBase::arrayBounds
ConfigBase * arrayBounds(char aStart, char aEnd)
Specify the start and end characters for an array.
Definition: ConfigFwd.hpp:99
CLI::ConfigItem::inputs
std::vector< std::string > inputs
Listing of inputs.
Definition: ConfigFwd.hpp:31
CLI::ConfigBase::valueDelimiter
char valueDelimiter
the character used separate the name from the value
Definition: ConfigFwd.hpp:86
CLI::ConfigBase::to_config
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:260
CLI::ConfigBase::commentChar
char commentChar
the character used for comments
Definition: ConfigFwd.hpp:78
CLI::Config::from_file
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:62
StringTools.hpp
CLI::App
Creates a command line program, with very few defaults.
Definition: App.hpp:66
CLI::Config::to_config
virtual std::string to_config(const App *, bool, bool, std::string) const =0
Convert an app into a configuration.
CLI::ConfigBase::arraySeparator
char arraySeparator
the character used to separate elements in an array
Definition: ConfigFwd.hpp:84
CLI::Config
This class provides a converter for configuration files.
Definition: ConfigFwd.hpp:42
CLI::ConfigBase::valueSeparator
ConfigBase * valueSeparator(char vSep)
Specify the delimiter between a name and value.
Definition: ConfigFwd.hpp:110
CLI::ConfigTOML
ConfigTOML generates a TOML compliant output.
Definition: ConfigFwd.hpp:120
CLI::Config::from_config
virtual std::vector< ConfigItem > from_config(std::istream &) const =0
Convert a configuration into an app.
CLI::Config::items
std::vector< ConfigItem > items
Definition: ConfigFwd.hpp:44
CLI::ConfigTOML::ConfigTOML
ConfigTOML()
Definition: ConfigFwd.hpp:123
CLI::ConfigBase::from_config
std::vector< ConfigItem > from_config(std::istream &input) const override
Convert a configuration into an app.
Definition: Config.hpp:165
CLI::ConfigItem
Holds values to load into Options.
Definition: ConfigFwd.hpp:23
CLI::ConfigItem::parents
std::vector< std::string > parents
This is the list of parents.
Definition: ConfigFwd.hpp:25