1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
#ifndef NEWSBOAT_CONFIGDATA_H_
#define NEWSBOAT_CONFIGDATA_H_
#include <string>
#include <unordered_set>
#include "3rd-party/expected.hpp"
namespace newsboat {
enum class ConfigDataType { INVALID, BOOL, INT, STR, PATH, ENUM };
/// Data about a setting: its default and current values, its type, and its
/// allowed values if it's an enum.
class ConfigData {
public:
/// Construct a value of type `t` and equal to `v`. If `multi_option` is
/// true and config file contains this option multiple times, the values
/// will be combined instead of rewritten.
ConfigData(const std::string& v = "",
ConfigDataType t = ConfigDataType::INVALID, bool multi_option = false);
/// Construct a value that can take any of given `values`, and currently
/// equal to `v` (which *must* be one of `values`).
ConfigData(const std::string& v, const std::unordered_set<std::string>& values);
/// Current value of the setting.
std::string value() const
{
return value_;
}
/// Change the setting's value to `new_value`.
///
/// On error, returns internationalized error message.
nonstd::expected<void, std::string> set_value(std::string new_value);
/// Default value of the setting.
std::string default_value() const
{
return default_value_;
}
/// Change the setting's value to the default one.
void reset_to_default()
{
value_ = default_value_;
}
/// The type of this setting.
ConfigDataType type() const
{
return type_;
}
/// Possible values of this setting if `type` is `ENUM`.
const std::unordered_set<std::string>& enum_values() const
{
return enum_values_;
}
/// If `true`, multiple values of this setting should be combined instead
/// of rewritten.
bool multi_option() const
{
return multi_option_;
}
private:
std::string value_;
std::string default_value_;
ConfigDataType type_;
std::unordered_set<std::string> enum_values_;
bool multi_option_;
};
} // namespace newsboat
#endif /* NEWSBOAT_CONFIGDATA_H_ */
|