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"
40namespace util::config {
68 auto const err = checkTypeConsistency(type_, value);
69 ASSERT(!err.has_value(),
"{}", err->error);
81 [[nodiscard]] std::optional<Error>
82 setValue(Value value, std::optional<std::string_view> key = std::nullopt)
84 if (std::holds_alternative<NullType>(value)) {
91 key.value_or(
"Unknown_key"),
92 "Provided value is null but ConfigValue is not optional and doesn't have a default value."
95 value_ = std::move(value);
99 auto err = checkTypeConsistency(type_, value);
100 if (err.has_value()) {
101 err->error = fmt::format(
"{} {}", key.value_or(
"Unknown_key"), err->error);
105 if (cons_.has_value()) {
106 auto constraintCheck = cons_->get().checkConstraint(value);
107 if (constraintCheck.has_value()) {
108 constraintCheck->error = fmt::format(
"{} {}", key.value_or(
"Unknown_key"), constraintCheck->error);
109 return constraintCheck;
130 cons_ = std::reference_wrapper<Constraint const>(cons);
131 ASSERT(cons_.has_value(),
"Constraint must be defined");
133 if (value_.has_value()) {
134 auto const& temp = cons_.value().get();
135 auto const& result = temp.checkConstraint(value_.value());
136 if (result.has_value()) {
141 [&
type](
bool tmp) {
type = fmt::format(
"bool {}", tmp); },
142 [&
type](std::string
const& tmp) {
type = fmt::format(
"string {}", tmp); },
143 [&
type](
double tmp) {
type = fmt::format(
"double {}", tmp); },
144 [&
type](int64_t tmp) {
type = fmt::format(
"int {}", tmp); },
149 ASSERT(
false,
"Value {} ConfigValue does not satisfy the set Constraint",
type);
160 [[nodiscard]]
constexpr std::optional<std::reference_wrapper<Constraint const>>
171 [[nodiscard]]
constexpr ConfigType
206 return value_.has_value();
214 [[nodiscard]] Value
const&
217 ASSERT(value_.has_value(),
"getValue() is called when there is no value set");
218 return value_.value();
231 stream <<
"- **Required**: " << (val.
isOptional() ?
"False" :
"True") <<
"\n";
232 stream <<
"- **Type**: " << val.
type() <<
"\n";
233 stream <<
"- **Default value**: " << (val.
hasValue() ? *val.value_ :
"None") <<
"\n";
234 stream <<
"- **Constraints**: ";
239 stream <<
"None" <<
"\n";
251 static std::optional<Error>
252 checkTypeConsistency(ConfigType
type, Value value)
254 if (
type == ConfigType::String && !std::holds_alternative<std::string>(value)) {
255 return Error{
"value does not match type string"};
257 if (
type == ConfigType::Boolean && !std::holds_alternative<bool>(value)) {
258 return Error{
"value does not match type boolean"};
260 if (
type == ConfigType::Double && (!std::holds_alternative<double>(value))) {
261 if (std::holds_alternative<int64_t>(value))
263 return Error{
"value does not match type double"};
265 if (
type == ConfigType::Integer && !std::holds_alternative<int64_t>(value)) {
266 return Error{
"value does not match type integer"};
272 bool optional_{
false};
273 std::optional<Value> value_;
274 std::optional<std::reference_wrapper<Constraint const>> cons_;
Represents the config values for Json/Yaml config.
Definition ConfigValue.hpp:48
friend std::ostream & operator<<(std::ostream &stream, ConfigValue val)
Prints all the info of this config value to the output stream.
Definition ConfigValue.hpp:229
constexpr ConfigType type() const
Gets the config type.
Definition ConfigValue.hpp:172
constexpr std::optional< std::reference_wrapper< Constraint const > > getConstraint() const
Retrieves the constraint associated with this ConfigValue, if any.
Definition ConfigValue.hpp:161
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:183
constexpr ConfigValue(ConfigType type)
Constructor initializing with the config type.
Definition ConfigValue.hpp:55
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:82
bool constexpr isOptional() const
Checks if configValue is optional.
Definition ConfigValue.hpp:194
ConfigValue & defaultValue(Value value)
Sets the default value for the config.
Definition ConfigValue.hpp:66
Value const & getValue() const
Get the value of config.
Definition ConfigValue.hpp:215
bool constexpr hasValue() const
Check if value is optional.
Definition ConfigValue.hpp:204
constexpr ConfigValue & withConstraint(Constraint const &cons)
Assigns a constraint to the ConfigValue.
Definition ConfigValue.hpp:128
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
A type that represents a null value.
Definition Types.hpp:40