119 #include <type_traits>
150 using schema::make_const_schema;
151 using schema::make_prototype;
152 using schema::make_schema;
161 template <
typename T>
163 using type = decltype(make_schema(
static_cast<T*
>(
nullptr),
""));
176 ~
Schema() noexcept
override =
default;
183 Schema(std::string desc, schema::PropertyList<> props)
186 Schema(schema::PropertyList<> props) :
Schema(
"", props) {}
188 Schema(std::string desc,
const Schema& base, schema::PropertyList<> props)
194 Schema(
const std::vector<Schema>& xs);
195 Schema(std::string desc,
const std::vector<Schema>& xs);
197 Schema(schema::BoxList props);
198 Schema(std::string desc, schema::BoxList props);
200 Schema(schema::BoxVec&& props);
201 Schema(std::string desc, schema::BoxVec&& props);
204 template <
typename T, std::enable_if_t<std::is_base_of_v<schema::Interface, T>,
int> = 0>
205 Schema(
const T& value) : impl_(value.clone()) {}
206 Schema(std::unique_ptr<schema::Interface> ptr) : impl_(std::move(ptr)) { assert(impl_); }
207 Schema(std::shared_ptr<schema::Interface> ptr) : impl_(std::move(ptr)) { assert(impl_); }
215 template <
typename T>
216 Schema(T* ptr, std::string desc) : impl_(make_schema(ptr, std::move(desc)).
clone()) {}
217 template <
typename T>
219 : impl_(make_schema(ptr, prototype, std::move(desc)).
clone()) {}
222 template <
typename T>
227 Schema reset_pointer() && {
229 return std::move(*
this);
232 [[nodiscard]]
Json json_schema_qualified()
const {
233 Json j = impl_->json_schema();
234 j[
"$schema"] =
"http://json-schema.org/draft-07/schema#";
238 [[nodiscard]]
Json json_schema_qualified(
const std::string&
id)
const {
239 Json j = json_schema_qualified();
245 using Interface::to_json;
247 [[nodiscard]] std::unique_ptr<Interface>
clone()
const override {
return impl_->clone(); }
249 [[nodiscard]] std::string
type_string()
const override {
return impl_->type_string(); }
250 [[nodiscard]]
bool is_required()
const override {
return impl_->is_required(); }
251 [[nodiscard]]
const std::string&
description()
const override {
return impl_->description(); }
252 void set_description(std::string s)
override {
return impl_->set_description(std::move(s)); }
253 [[nodiscard]]
Json usage()
const override {
return impl_->usage(); }
255 bool validate(
const Conf& c, std::optional<SchemaError>& err)
const override {
256 return impl_->validate(c, err);
265 std::shared_ptr<schema::Interface> impl_{
nullptr};
Definition: schema.hpp:173
bool is_required() const override
Definition: schema.hpp:250
void to_json(Json &j) const override
Definition: schema.hpp:258
Json usage() const override
Definition: schema.hpp:253
const std::string & description() const override
Definition: schema.hpp:251
void reset_ptr() override
Definition: schema.hpp:260
void set_description(std::string s) override
Definition: schema.hpp:252
void from_conf(const Conf &c) override
Definition: schema.hpp:259
Json json_schema() const override
Definition: schema.hpp:254
std::string type_string() const override
Definition: schema.hpp:249
std::unique_ptr< Interface > clone() const override
Definition: schema.hpp:247
JsonType type() const override
Definition: schema.hpp:248
bool validate(const Conf &c, std::optional< SchemaError > &err) const override
Definition: schema.hpp:255
Definition: interface.hpp:297
Definition: ignore.hpp:43
Definition: interface.hpp:67
virtual Json to_json() const
Definition: interface.hpp:254
Definition: struct.hpp:70
nlohmann::json Json
Definition: fable_fwd.hpp:35
nlohmann::json::value_t JsonType
Definition: json.hpp:78
Definition: schema.hpp:162