28 #include <type_traits>
35 namespace fable::schema {
42 Enum(Type* ptr, std::string desc)
44 , mapping_to_(enum_serialization<T>())
45 , mapping_from_(enum_deserialization<T>())
47 keys_.reserve(mapping_to_.size());
48 for (
auto const& kv : mapping_to_) {
49 keys_.emplace_back(kv.second);
54 [[nodiscard]]
const std::vector<std::string>& keys()
const {
return keys_; }
62 this->augment_schema(j);
66 bool validate(
const Conf& c, std::optional<SchemaError>& err)
const override {
67 auto s = c.
get<std::string>();
68 if (mapping_from_.count(s) == 0) {
69 return this->set_error(err, c,
"invalid value for enum: {}", s);
77 assert(ptr_ !=
nullptr);
82 assert(ptr_ !=
nullptr);
83 *ptr_ = deserialize(c);
86 Json serialize(
const Type& x)
const {
return mapping_to_.at(x); }
88 Type deserialize(
const Conf& c)
const {
89 auto s = c.
get<std::string>();
91 return mapping_from_.at(s);
92 }
catch (std::out_of_range& e) {
93 throw this->error(c,
"invalid value for enum: {}", s);
97 void serialize_into(Json& j,
const Type& x)
const { j = mapping_to_.at(x); }
99 void deserialize_into(
const Conf& c, Type& x)
const { x = deserialize(c); }
104 const std::map<T, std::string>& mapping_to_;
105 const std::map<std::string, T>& mapping_from_;
106 std::vector<std::string> keys_;
110 template <
typename T,
typename S, std::enable_if_t<std::is_enum_v<T>,
int> = 0>
111 Enum<T> make_schema(T* ptr, S&& desc) {
112 return {ptr, std::forward<S>(desc)};
T get() const
Definition: conf.hpp:297
Definition: interface.hpp:398
std::string type_string() const override
Definition: interface.hpp:419
Json json_schema() const override
Definition: enum.hpp:57
void to_json(Json &j) const override
Definition: enum.hpp:76
void reset_ptr() override
Definition: enum.hpp:101
bool validate(const Conf &c, std::optional< SchemaError > &err) const override
Definition: enum.hpp:66
void from_conf(const Conf &c) override
Definition: enum.hpp:81
virtual Json to_json() const
Definition: interface.hpp:254
nlohmann::json Json
Definition: fable_fwd.hpp:35