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 = 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)
79 , prototype_(std::move(prototype))
81 prototype_.reset_ptr();
85 [[nodiscard]] std::string
type_string()
const override {
return prototype_.type_string() +
"?"; }
86 [[nodiscard]]
bool is_variant()
const override {
return true; }
95 prototype_.json_schema(),
98 this->augment_schema(j);
102 bool validate(
const Conf& c, std::optional<SchemaError>& err)
const override {
103 if (c->type() == JsonType::null) {
109 return prototype_.validate(c, err);
114 assert(ptr_ !=
nullptr);
115 j = serialize(*ptr_);
119 assert(ptr_ !=
nullptr);
120 *ptr_ = deserialize(c);
123 [[nodiscard]]
Json serialize(
const Type& x)
const {
127 return prototype_.serialize(x.value());
130 [[nodiscard]] Type deserialize(
const Conf& c)
const {
131 if (c->type() == JsonType::null) {
134 return prototype_.deserialize(c);
137 void serialize_into(Json& j,
const Type& x)
const { j = serialize(x); }
139 void deserialize_into(
const Conf& c, Type& x)
const { x = deserialize(c); }
144 PrototypeSchema prototype_;
149 template <
typename T,
typename P, std::enable_if_t<is_optional_v<T>,
bool> = true>
150 inline Optional<T, P> make_schema(T* ptr, P prototype, std::string desc) {
151 return Optional<T, P>(ptr, std::move(prototype), std::move(desc));
154 template <
typename T, std::enable_if_t<is_optional_v<T>,
bool> = true>
155 Optional<T, decltype(make_prototype<typename T::value_type>())> make_schema(T* ptr,
157 return Optional<T, decltype(make_prototype<typename T::value_type>())>(ptr, std::move(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:85
void to_json(Json &j) const override
Definition: optional.hpp:113
bool is_variant() const override
Definition: optional.hpp:86
bool validate(const Conf &c, std::optional< SchemaError > &err) const override
Definition: optional.hpp:102
Json json_schema() const override
Definition: optional.hpp:88
void reset_ptr() override
Definition: optional.hpp:141
void from_conf(const Conf &c) override
Definition: optional.hpp:118
nlohmann::json Json
Definition: fable_fwd.hpp:35
Definition: optional.hpp:47