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_; }
76 [[nodiscard]]
Variant require() && {
78 return std::move(*
this);
80 void set_required(
bool value) {
83 [[nodiscard]] Variant required(
bool value) && {
85 return std::move(*
this);
88 [[nodiscard]]
bool has_description()
const {
return !desc_.empty(); }
90 [[nodiscard]]
const std::string&
description()
const override {
return desc_; }
92 desc_ = std::move(desc);
93 return std::move(*
this);
97 [[nodiscard]]
bool unique_match()
const {
100 void set_unique_match(
bool value) {
101 unique_match_ = value;
103 [[nodiscard]] Variant unique_match(
bool value) && {
104 unique_match_ = value;
105 return std::move(*
this);
108 [[nodiscard]] Variant reset_pointer() && {
110 return std::move(*
this);
116 bool validate(
const Conf& c, std::optional<SchemaError>& err)
const override {
117 return validate_index(c, err).has_value();
121 auto index = variant_index(c);
122 schemas_[index].from_conf(c);
134 std::optional<size_t> validate_index(
const Conf& c, std::optional<SchemaError>& err)
const;
135 [[nodiscard]]
size_t variant_index(
const Conf& c)
const;
139 std::vector<Box> schemas_;
140 bool required_{
false};
141 JsonType type_{JsonType::null};
142 std::string type_string_{};
143 bool unique_match_{
false};
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:116
void reset_ptr() override
Definition: variant.cpp:142
const std::string & description() const override
Definition: variant.hpp:90
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:119
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:120
Json json_schema() const override
Definition: variant.cpp:85
void set_description(std::string s) override
Definition: variant.hpp:89
nlohmann::json Json
Definition: fable_fwd.hpp:35
nlohmann::json::value_t JsonType
Definition: json.hpp:78