25 #ifndef FABLE_SCHEMA_INTERFACE_HPP_ 26 #define FABLE_SCHEMA_INTERFACE_HPP_ 30 #include <type_traits> 129 virtual const std::string&
description()
const = 0;
258 template <
typename S>
259 using enable_if_schema_t = std::enable_if_t<std::is_base_of<Interface, S>::value>;
266 Box(
const Box&) =
default;
268 Box& operator=(
const Box&) =
default;
271 Box(std::shared_ptr<Interface> i) : impl_(std::move(i)) { assert(impl_); }
277 std::shared_ptr<Interface>
get() {
return impl_; }
288 template <
typename T>
289 std::shared_ptr<T>
as()
const {
290 assert(impl_ !=
nullptr);
291 auto downcast_ptr = std::dynamic_pointer_cast<T>(impl_);
292 if (downcast_ptr ==
nullptr) {
309 "cannot dynamic_pointer_cast to type T, got nullptr"};
320 template <
typename T>
322 return std::dynamic_pointer_cast<T>(impl_);
325 Box reset_pointer() && {
327 return std::move(*
this);
334 std::string
type_string()
const override {
return impl_->type_string(); }
335 bool is_required()
const override {
return impl_->is_required(); }
336 const std::string&
description()
const override {
return impl_->description(); }
337 void set_description(
const std::string& s)
override {
return impl_->set_description(s); }
345 friend void to_json(
Json& j,
const Box& b) { b.impl_->to_json(j); }
348 std::shared_ptr<Interface> impl_{
nullptr};
353 template <
typename CRTP>
357 Base(
JsonType t, std::string&& desc) : type_(t), desc_(std::move(desc)) {}
359 explicit Base(std::string&& desc) : desc_(std::move(desc)) {}
360 virtual ~
Base() =
default;
362 Interface*
clone()
const override {
return new CRTP(static_cast<CRTP const&>(*
this)); }
363 operator Box()
const {
return Box{this->
clone()}; }
366 std::string
type_string()
const override {
return to_string(type_); }
369 auto required = required_ ?
"!" :
"";
373 return fmt::format(
"{}{} :: {}",
type_string(), required, desc_);
380 return std::move(*dynamic_cast<CRTP*>(
this));
382 CRTP required(
bool value) && {
384 return std::move(*dynamic_cast<CRTP*>(
this));
387 CRTP reset_pointer() && {
389 return std::move(*dynamic_cast<CRTP*>(
this));
392 bool has_description()
const {
return !desc_.empty(); }
397 desc_ = std::move(desc);
398 return std::move(*dynamic_cast<CRTP*>(
this));
402 void validate_type(
const Conf& c)
const {
403 if (c->type() != type_) {
404 if (c->type() == JsonType::number_unsigned && type_ == JsonType::number_integer) {
409 to_string(c->type())};
413 template <
typename... Args>
414 [[noreturn]]
void throw_error(
const Conf& c,
const char* format, Args... args)
const {
418 [[noreturn]]
void throw_error(
const ConfError& e)
const {
422 [[noreturn]]
void throw_wrong_type(
const Conf& c)
const {
423 throw_error(error::WrongType(c, type_));
426 void augment_schema(
Json& j)
const {
427 if (!desc_.empty()) {
428 j[
"description"] = desc_;
434 bool required_{
false};
448 template <
typename T>
449 using enable_if_confable_t = std::enable_if_t<std::is_base_of<Confable, T>::value>;
459 template <
typename T>
460 using enable_if_not_confable_t = std::enable_if_t<!std::is_base_of<Confable, T>::value>;
462 template <typename T, std::enable_if_t<std::is_base_of<Confable, T>::value,
int> = 0>
463 auto make_prototype(std::string&& desc =
"");
465 template <typename T, std::enable_if_t<!std::is_base_of<Confable, T>::value,
int> = 0>
466 auto make_prototype(std::string&& desc =
"");
471 #endif // FABLE_SCHEMA_INTERFACE_HPP_ std::shared_ptr< T > as() const
Definition: interface.hpp:289
virtual void reset_ptr()=0
Json usage() const override
Definition: interface.hpp:338
virtual void from_conf(const Conf &)=0
std::string type_string() const override
Definition: interface.hpp:334
JsonType type() const override
Definition: interface.hpp:365
virtual std::string type_string() const =0
bool is_required() const override
Definition: interface.hpp:377
Definition: interface.hpp:263
virtual void validate(const Conf &c) const =0
Interface * clone() const override
Definition: interface.hpp:362
void set_description(const std::string &s) override
Definition: interface.hpp:337
const std::string & description() const override
Definition: interface.hpp:395
nlohmann::json Json
Definition: json.hpp:62
void reset_ptr() override
Definition: interface.hpp:343
bool is_required() const override
Definition: interface.hpp:335
Definition: error.hpp:120
Json::value_t JsonType
Definition: json.hpp:78
Definition: interface.hpp:72
void from_conf(const Conf &c) override
Definition: interface.hpp:342
std::shared_ptr< T > as_unsafe() const
Definition: interface.hpp:321
virtual Interface * clone() const =0
virtual bool is_valid(const Conf &c) const
Definition: interface.hpp:205
virtual Json usage() const =0
virtual Json to_json() const
Definition: interface.hpp:220
Interface * clone() const override
Definition: interface.hpp:332
JsonType type() const override
Definition: interface.hpp:333
virtual const std::string & description() const =0
void validate(const Conf &c) const override
Definition: interface.hpp:340
virtual bool is_required() const =0
const std::string & description() const override
Definition: interface.hpp:336
virtual void set_description(const std::string &s)=0
void to_json(Json &j) const override
Definition: interface.hpp:341
Definition: interface.hpp:354
std::string type_string() const override
Definition: interface.hpp:366
Json json_schema() const override
Definition: interface.hpp:339
virtual JsonType type() const =0
Json usage() const override
Definition: interface.hpp:368
virtual Json json_schema() const =0
void set_description(const std::string &s) override
Definition: interface.hpp:393
virtual bool is_variant() const
Definition: interface.hpp:91