22#include "util/Assert.hpp"
23#include "util/OverloadSet.hpp"
24#include "util/config/ConfigConstraints.hpp"
25#include "util/config/Error.hpp"
26#include "util/config/Types.hpp"
28#include <fmt/format.h>
39namespace util::config {
66 defaultValue(Value value, std::optional<std::string_view> description = std::nullopt)
68 auto const err = checkTypeConsistency(type_, value);
70 ASSERT(
false,
"{}", err->error);
71 description_ = description;
84 [[nodiscard]] std::optional<Error>
85 setValue(Value value, std::optional<std::string_view> key = std::nullopt)
87 auto err = checkTypeConsistency(type_, value);
88 if (err.has_value()) {
89 err->error = fmt::format(
"{} {}", key.value_or(
"Unknown_key"), err->error);
93 if (cons_.has_value()) {
94 auto constraintCheck = cons_->get().checkConstraint(value);
95 if (constraintCheck.has_value()) {
96 constraintCheck->error =
97 fmt::format(
"{} {}", key.value_or(
"Unknown_key"), constraintCheck->error);
98 return constraintCheck;
119 cons_ = std::reference_wrapper<Constraint const>(cons);
120 ASSERT(cons_.has_value(),
"Constraint must be defined");
122 if (value_.has_value()) {
123 auto const& temp = cons_.value().get();
124 auto const& result = temp.checkConstraint(value_.value());
125 if (result.has_value()) {
130 [&
type](
bool tmp) {
type = fmt::format(
"bool {}", tmp); },
131 [&
type](std::string
const& tmp) {
type = fmt::format(
"string {}", tmp); },
132 [&
type](
double tmp) {
type = fmt::format(
"double {}", tmp); },
133 [&
type](int64_t tmp) {
type = fmt::format(
"int {}", tmp); },
137 ASSERT(
false,
"Value {} ConfigValue does not satisfy the set Constraint",
type);
148 [[nodiscard]]
constexpr std::optional<std::reference_wrapper<Constraint const>>
159 [[nodiscard]]
constexpr ConfigType
195 return value_.has_value();
203 [[nodiscard]] Value
const&
206 ASSERT(value_.has_value(),
"getValue() is called when there is no value set");
207 return value_.value();
220 stream <<
"- **Required**: " << (val.
isOptional() ?
"False" :
"True") <<
"\n";
221 stream <<
"- **Type**: " << val.
type() <<
"\n";
222 if (val.description_.has_value()) {
223 stream <<
"- **Default value**: " << *val.description_ <<
"\n";
225 stream <<
"- **Default value**: `" << *val.value_ <<
"`\n";
227 stream <<
"- **Default value**: None\n";
229 stream <<
"- **Constraints**: ";
234 stream <<
"None" <<
"\n";
246 static std::optional<Error>
247 checkTypeConsistency(ConfigType
type, Value value)
249 if (
type == ConfigType::String && !std::holds_alternative<std::string>(value)) {
250 return Error{
"value does not match type string"};
252 if (
type == ConfigType::Boolean && !std::holds_alternative<bool>(value)) {
253 return Error{
"value does not match type boolean"};
255 if (
type == ConfigType::Double && (!std::holds_alternative<double>(value))) {
256 if (std::holds_alternative<int64_t>(value))
258 return Error{
"value does not match type double"};
260 if (
type == ConfigType::Integer && !std::holds_alternative<int64_t>(value)) {
261 return Error{
"value does not match type integer"};
267 bool optional_{
false};
268 std::optional<Value> value_;
269 std::optional<std::reference_wrapper<Constraint const>> cons_;
270 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:218
constexpr ConfigType type() const
Gets the config type.
Definition ConfigValue.hpp:160
constexpr std::optional< std::reference_wrapper< Constraint const > > getConstraint() const
Retrieves the constraint associated with this ConfigValue, if any.
Definition ConfigValue.hpp:149
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:172
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:85
bool constexpr isOptional() const
Checks if configValue is optional.
Definition ConfigValue.hpp:183
Value const & getValue() const
Get the value of config.
Definition ConfigValue.hpp:204
bool constexpr hasValue() const
Check if value is optional.
Definition ConfigValue.hpp:193
constexpr ConfigValue & withConstraint(Constraint const &cons)
Assigns a constraint to the ConfigValue.
Definition ConfigValue.hpp:117
An interface to enforce constraints on certain values within ClioConfigDefinition.
Definition ConfigConstraints.hpp:95
Overload set for lambdas.
Definition OverloadSet.hpp:30
Displays the different errors when parsing user config.
Definition Error.hpp:31