29 #include <type_traits>
35 namespace fable::schema {
53 template <
typename S = Box>
54 using PropertyList = std::initializer_list<std::pair<std::string const, S>>;
56 template <
typename T,
typename S = Box>
57 using enable_if_property_list_t = std::enable_if_t<std::is_same_v<PropertyList<S>, T>>;
72 explicit Struct(std::string desc =
"") :
Base(JsonType::object, std::move(desc)) {}
74 Struct(std::string desc, PropertyList<Box> props) :
Base(JsonType::object, std::move(desc)) {
105 Struct(std::string desc,
const Box& base, PropertyList<Box> props)
107 desc_ = std::move(desc);
111 Struct(
const Box& base, PropertyList<Box> props) :
Struct(
"", base, props) {}
121 Struct property(
const std::string& key, Box&& s) && {
123 return std::move(*
this);
142 template <
typename T,
typename = enable_if_confable_t<T>>
147 template <
typename T>
148 Struct properties_from(
const T x) && {
150 return std::move(*
this);
159 void set_require(std::initializer_list<std::string> init);
160 Struct require(std::initializer_list<std::string> init) &&;
171 Struct require_all() &&;
180 additional_properties_ = v;
181 return std::move(*
this);
184 template <
typename S,
typename = enable_if_schema_t<S>>
185 void set_additional_properties(
const S& s) {
186 additional_properties_ =
true;
187 additional_prototype_ = s.clone();
188 additional_prototype_->reset_ptr();
191 template <
typename S,
typename = enable_if_schema_t<S>>
192 Struct additional_properties(
const S& s) && {
193 set_additional_properties(s);
194 return std::move(*
this);
197 [[nodiscard]]
bool additional_properties()
const {
return additional_properties_; }
203 [[nodiscard]]
Json usage()
const override;
205 bool validate(
const Conf& c, std::optional<SchemaError>& err)
const override;
206 void to_json(Json& j)
const override;
224 std::map<std::string, Box> properties_{};
225 std::vector<std::string> properties_required_{};
226 std::shared_ptr<Interface> additional_prototype_{};
227 bool additional_properties_{
false};
230 template <
typename T,
typename = enable_if_property_list_t<T>>
231 inline Struct make_schema(T&& props) {
232 return Struct(std::forward<T>(props));
235 template <
typename T,
typename = enable_if_property_list_t<T>>
236 inline Struct make_schema(std::string desc, T&& props) {
237 return Struct(std::move(desc), std::forward<T>(props));
240 template <
typename T,
typename = enable_if_property_list_t<T>>
241 inline Struct make_schema(std::string desc,
const Box& base, T&& props) {
242 return Struct(std::move(desc), base, std::forward<T>(props));
245 template <
typename T,
typename = enable_if_property_list_t<T>>
246 inline Struct make_schema(std::string desc,
const Struct& base, T&& props) {
247 return Struct(std::move(desc), base, std::forward<T>(props));
Definition: interface.hpp:398
Definition: interface.hpp:297
virtual Json to_json() const
Definition: interface.hpp:254
Definition: struct.hpp:70
void set_properties_from(const Struct &s)
Definition: struct.hpp:138
Json json_schema() const override
Definition: struct.cpp:91
void set_property(const std::string &key, Box &&s)
Definition: struct.cpp:31
bool validate(const Conf &c, std::optional< SchemaError > &err) const override
Definition: struct.cpp:111
Struct(std::string desc, const Box &base, PropertyList< Box > props)
Definition: struct.hpp:105
virtual Json to_json() const
Definition: interface.hpp:254
void reset_ptr() override
Definition: struct.cpp:177
void set_require_all()
Definition: struct.cpp:71
void set_require(std::initializer_list< std::string > init)
Definition: struct.cpp:57
Json usage() const override
Definition: struct.cpp:83
void set_properties(PropertyList< Box > props)
Definition: struct.cpp:45
Struct additional_properties(bool v) &&
Definition: struct.hpp:179
void from_conf(const Conf &c) override
Definition: struct.cpp:142
nlohmann::json Json
Definition: fable_fwd.hpp:35