33 namespace fable::schema {
35 using BoxVec = std::vector<Box>;
36 using BoxList = std::initializer_list<Box>;
59 Variant(std::string desc, std::initializer_list<Box> vec)
60 :
Variant(std::move(desc), std::vector<Box>(vec)) {}
63 Variant(std::string desc, std::vector<Box>&& vec);
66 [[nodiscard]] std::unique_ptr<Interface>
clone()
const override {
67 return std::make_unique<Variant>(*
this);
69 [[nodiscard]]
operator Box()
const {
return Box{this->
clone()}; }
71 [[nodiscard]] std::string
type_string()
const override {
return type_string_; }
72 [[nodiscard]]
bool is_variant()
const override {
return true; }
73 [[nodiscard]]
Json usage()
const override;
75 [[nodiscard]]
bool is_required()
const override {
return required_; }
78 return std::move(*
this);
80 Variant required(
bool value) && {
82 return std::move(*
this);
85 [[nodiscard]]
bool has_description()
const {
return !desc_.empty(); }
87 [[nodiscard]]
const std::string&
description()
const override {
return desc_; }
89 desc_ = std::move(desc);
90 return std::move(*
this);
94 Variant unique_match(
bool value) && {
95 unique_match_ = value;
96 return std::move(*
this);
99 Variant reset_pointer() && {
101 return std::move(*
this);
107 bool validate(
const Conf& c, std::optional<SchemaError>& err)
const override {
108 return validate_index(c, err).has_value();
112 auto index = variant_index(c);
113 schemas_[index].from_conf(c);
125 std::optional<size_t> validate_index(
const Conf& c, std::optional<SchemaError>& err)
const;
126 [[nodiscard]]
size_t variant_index(
const Conf& c)
const;
130 std::vector<Box> schemas_;
131 bool required_{
false};
132 JsonType type_{JsonType::null};
133 std::string type_string_{};
134 bool unique_match_{
false};
137 inline Variant make_schema(std::initializer_list<Box> vec) {
return {vec}; }
138 inline Variant make_schema(std::string desc, std::initializer_list<Box> vec) {
139 return {std::move(desc), std::vector<Box>(vec)};
142 inline Variant make_schema(std::vector<Box>&& vec) {
return {std::move(vec)}; }
143 inline Variant make_schema(std::string desc, std::vector<Box>&& vec) {
144 return {std::move(desc), std::move(vec)};
Definition: interface.hpp:297
Definition: interface.hpp:67
virtual Json to_json() const
Definition: interface.hpp:254
Definition: variant.hpp:56
bool is_variant() const override
Definition: variant.hpp:72
bool validate(const Conf &c, std::optional< SchemaError > &err) const override
Definition: variant.hpp:107
void reset_ptr() override
Definition: variant.cpp:142
const std::string & description() const override
Definition: variant.hpp:87
std::unique_ptr< Interface > clone() const override
Definition: variant.hpp:66
Json usage() const override
Definition: variant.cpp:76
JsonType type() const override
Definition: variant.hpp:70
void to_json(Json &j) const override
Definition: variant.hpp:110
std::string type_string() const override
Definition: variant.hpp:71
bool is_required() const override
Definition: variant.hpp:75
void from_conf(const Conf &c) override
Definition: variant.hpp:111
Json json_schema() const override
Definition: variant.cpp:85
void set_description(std::string s) override
Definition: variant.hpp:86
nlohmann::json Json
Definition: fable_fwd.hpp:35
nlohmann::detail::value_t JsonType
Definition: fable_fwd.hpp:37