26 #include <initializer_list>
29 #include <type_traits>
33 namespace fable::schema {
37 static_assert(std::is_arithmetic_v<T>,
"arithmetic value required");
42 template <
typename X = T, std::enable_if_t<std::is_
integral_v<X> && std::is_
unsigned_v<X>,
int> = 0>
43 Number(Type* ptr, std::string desc)
44 :
Base<Number<T>>(JsonType::number_unsigned, std::move(desc)), ptr_(ptr) {}
46 template <
typename X = T, std::enable_if_t<std::is_
integral_v<X> && std::is_
signed_v<X>,
int> = 0>
47 Number(Type* ptr, std::string desc)
48 :
Base<Number<T>>(JsonType::number_integer, std::move(desc)), ptr_(ptr) {}
50 template <
typename X = T, std::enable_if_t<std::is_
floating_po
int_v<X>,
int> = 0>
51 Number(Type* ptr, std::string desc)
52 :
Base<Number<T>>(JsonType::number_float, std::move(desc)), ptr_(ptr) {}
55 [[nodiscard]] T minimum()
const {
return value_min_; }
56 [[nodiscard]]
bool exclusive_minimum()
const {
return exclusive_min_; }
60 [[nodiscard]] T maximum()
const {
return value_max_; }
61 [[nodiscard]]
bool exclusive_maximum()
const {
return exclusive_max_; }
65 [[nodiscard]] std::pair<T, T> bounds()
const;
67 Number<T> bounds_with(T min, T max, std::initializer_list<T> whitelisted) &&;
69 [[nodiscard]]
const std::set<T>& whitelist()
const {
return whitelist_; }
71 Number<T> whitelist(std::initializer_list<T> xs) &&;
72 void insert_whitelist(T x);
74 [[nodiscard]]
const std::set<T>& blacklist()
const {
return blacklist_; }
76 Number<T> blacklist(std::initializer_list<T> xs) &&;
77 void insert_blacklist(T x);
81 bool validate(
const Conf& c, std::optional<SchemaError>& err)
const override;
85 [[nodiscard]]
Json serialize(
const Type& x)
const;
86 [[nodiscard]] Type deserialize(
const Conf& c)
const;
87 void serialize_into(
Json& j,
const Type& x)
const;
88 void deserialize_into(
const Conf& c, Type& x)
const;
93 bool validate_bounds(
const Conf& c, std::optional<SchemaError>& err)
const;
96 bool exclusive_min_{
false};
97 bool exclusive_max_{
false};
98 T value_min_{std::numeric_limits<T>::lowest()};
99 T value_max_{std::numeric_limits<T>::max()};
100 std::set<T> whitelist_{};
101 std::set<T> blacklist_{};
105 template <
typename T, std::enable_if_t<std::is_arithmetic_v<T> && !std::is_enum_v<T>,
int> = 0>
106 inline Number<T> make_schema(T* ptr, std::string desc) {
Definition: interface.hpp:398
virtual Json to_json() const
Definition: interface.hpp:254
Definition: number.hpp:36
void from_conf(const Conf &c) override
Definition: number_impl.hpp:198
virtual Json to_json() const
Definition: interface.hpp:254
Json json_schema() const override
Definition: number_impl.hpp:147
void reset_ptr() override
Definition: number_impl.hpp:224
bool validate(const Conf &c, std::optional< SchemaError > &err) const override
Definition: number_impl.hpp:174
nlohmann::json Json
Definition: fable_fwd.hpp:35