22#include "util/Assert.hpp"
23#include "util/OverloadSet.hpp"
24#include "util/newconfig/ConfigConstraints.hpp"
25#include "util/newconfig/Error.hpp"
26#include "util/newconfig/Types.hpp"
39namespace util::config {
66 defaultValue(Value value, std::optional<std::string_view> description = std::nullopt)
68 auto const err = checkTypeConsistency(type_, value);
69 ASSERT(!err.has_value(),
"{}", err->error);
70 description_ = description;
82 [[nodiscard]] std::optional<Error>
83 setValue(Value value, std::optional<std::string_view> key = std::nullopt)
85 auto err = checkTypeConsistency(type_, value);
86 if (err.has_value()) {
87 err->error = fmt::format(
"{} {}", key.value_or(
"Unknown_key"), err->error);
91 if (cons_.has_value()) {
92 auto constraintCheck = cons_->get().checkConstraint(value);
93 if (constraintCheck.has_value()) {
94 constraintCheck->error = fmt::format(
"{} {}", key.value_or(
"Unknown_key"), constraintCheck->error);
95 return constraintCheck;
116 cons_ = std::reference_wrapper<Constraint const>(cons);
117 ASSERT(cons_.has_value(),
"Constraint must be defined");
119 if (value_.has_value()) {
120 auto const& temp = cons_.value().get();
121 auto const& result = temp.checkConstraint(value_.value());
122 if (result.has_value()) {
127 [&
type](
bool tmp) {
type = fmt::format(
"bool {}", tmp); },
128 [&
type](std::string
const& tmp) {
type = fmt::format(
"string {}", tmp); },
129 [&
type](
double tmp) {
type = fmt::format(
"double {}", tmp); },
130 [&
type](int64_t tmp) {
type = fmt::format(
"int {}", tmp); },
134 ASSERT(
false,
"Value {} ConfigValue does not satisfy the set Constraint",
type);
145 [[nodiscard]]
constexpr std::optional<std::reference_wrapper<Constraint const>>
156 [[nodiscard]]
constexpr ConfigType
191 return value_.has_value();
199 [[nodiscard]] Value
const&
202 ASSERT(value_.has_value(),
"getValue() is called when there is no value set");
203 return value_.value();
216 stream <<
"- **Required**: " << (val.
isOptional() ?
"False" :
"True") <<
"\n";
217 stream <<
"- **Type**: " << val.
type() <<
"\n";
218 if (val.description_.has_value()) {
219 stream <<
"- **Default value**: " << *val.description_ <<
"\n";
221 stream <<
"- **Default value**: `" << *val.value_ <<
"`\n";
223 stream <<
"- **Default value**: None\n";
225 stream <<
"- **Constraints**: ";
230 stream <<
"None" <<
"\n";
242 static std::optional<Error>
243 checkTypeConsistency(ConfigType
type, Value value)
245 if (
type == ConfigType::String && !std::holds_alternative<std::string>(value)) {
246 return Error{
"value does not match type string"};
248 if (
type == ConfigType::Boolean && !std::holds_alternative<bool>(value)) {
249 return Error{
"value does not match type boolean"};
251 if (
type == ConfigType::Double && (!std::holds_alternative<double>(value))) {
252 if (std::holds_alternative<int64_t>(value))
254 return Error{
"value does not match type double"};
256 if (
type == ConfigType::Integer && !std::holds_alternative<int64_t>(value)) {
257 return Error{
"value does not match type integer"};
263 bool optional_{
false};
264 std::optional<Value> value_;
265 std::optional<std::reference_wrapper<Constraint const>> cons_;
266 std::optional<std::string_view> description_;
Represents the config values for Json/Yaml config.
Definition ConfigValue.hpp:47
ConfigValue & defaultValue(Value value, std::optional< std::string_view > description=std::nullopt)
Sets the default value for the config.
Definition ConfigValue.hpp:66
friend std::ostream & operator<<(std::ostream &stream, ConfigValue val)
Prints all the info of this config value to the output stream.
Definition ConfigValue.hpp:214
constexpr ConfigType type() const
Gets the config type.
Definition ConfigValue.hpp:157
constexpr std::optional< std::reference_wrapper< Constraint const > > getConstraint() const
Retrieves the constraint associated with this ConfigValue, if any.
Definition ConfigValue.hpp:146
constexpr ConfigValue & optional()
Sets the config value as optional, meaning the user doesn't have to provide the value in their config...
Definition ConfigValue.hpp:168
constexpr ConfigValue(ConfigType type)
Constructor initializing with the config type.
Definition ConfigValue.hpp:54
std::optional< Error > setValue(Value value, std::optional< std::string_view > key=std::nullopt)
Sets the value current ConfigValue given by the User's defined value.
Definition ConfigValue.hpp:83
bool constexpr isOptional() const
Checks if configValue is optional.
Definition ConfigValue.hpp:179
Value const & getValue() const
Get the value of config.
Definition ConfigValue.hpp:200
bool constexpr hasValue() const
Check if value is optional.
Definition ConfigValue.hpp:189
constexpr ConfigValue & withConstraint(Constraint const &cons)
Assigns a constraint to the ConfigValue.
Definition ConfigValue.hpp:114
An interface to enforce constraints on certain values within ClioConfigDefinition.
Definition ConfigConstraints.hpp:91
Overload set for lambdas.
Definition OverloadSet.hpp:30
Displays the different errors when parsing user config.
Definition Error.hpp:31