29 #include <type_traits>
33 #include <fable/utility/optional.hpp>
35 namespace fable::schema {
65 template <
typename T,
typename P>
67 static_assert(is_optional_v<T>);
71 using ValueType =
typename Type::value_type;
72 using PrototypeSchema = std::remove_cv_t<std::remove_reference_t<P>>;
74 Optional(Type* ptr, std::string desc)
75 :
Optional(ptr, make_prototype<typename T::value_type>(), std::move(desc)) {}
77 Optional(Type* ptr, PrototypeSchema prototype, std::string desc)
78 :
Base<Optional<T, P>>(prototype.type(), std::move(desc)), prototype_(std::move(prototype)), ptr_(ptr) {
79 prototype_.reset_ptr();
83 [[nodiscard]] std::string
type_string()
const override {
return prototype_.type_string() +
"?"; }
84 [[nodiscard]]
bool is_variant()
const override {
return true; }
93 prototype_.json_schema(),
96 this->augment_schema(j);
100 bool validate(
const Conf& c, std::optional<SchemaError>& err)
const override {
101 if (c->type() == JsonType::null) {
107 return prototype_.validate(c, err);
112 assert(ptr_ !=
nullptr);
113 j = serialize(*ptr_);
117 assert(ptr_ !=
nullptr);
118 *ptr_ = deserialize(c);
121 [[nodiscard]]
Json serialize(
const Type& x)
const {
125 return prototype_.serialize(x.value());
128 [[nodiscard]] Type deserialize(
const Conf& c)
const {
129 if (c->type() == JsonType::null) {
132 return prototype_.deserialize(c);
135 void serialize_into(Json& j,
const Type& x)
const { j = serialize(x); }
137 void deserialize_into(
const Conf& c, Type& x)
const { x = deserialize(c); }
142 PrototypeSchema prototype_;
147 template <
typename T,
typename P,
typename S, std::enable_if_t<is_optional_v<T>,
bool> = true>
148 Optional<T, P> make_schema(T* ptr, P&& prototype, S&& desc) {
149 return {ptr, std::forward<P>(prototype), std::forward<S>(desc)};
152 template <
typename T,
typename S, std::enable_if_t<is_optional_v<T>,
bool> = true>
153 Optional<T, decltype(make_prototype<typename T::value_type>())> make_schema(T* ptr, S&& desc) {
154 return {ptr, std::forward<S>(desc)};
Definition: interface.hpp:398
bool validate_type(const Conf &c, std::optional< SchemaError > &err) const
Definition: interface.hpp:459
virtual Json to_json() const
Definition: interface.hpp:254
Definition: optional.hpp:66
std::string type_string() const override
Definition: optional.hpp:83
void to_json(Json &j) const override
Definition: optional.hpp:111
bool is_variant() const override
Definition: optional.hpp:84
bool validate(const Conf &c, std::optional< SchemaError > &err) const override
Definition: optional.hpp:100
Json json_schema() const override
Definition: optional.hpp:86
void reset_ptr() override
Definition: optional.hpp:139
void from_conf(const Conf &c) override
Definition: optional.hpp:116
nlohmann::json Json
Definition: fable_fwd.hpp:35
Definition: optional.hpp:47