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);
76 assert(ptr_ !=
nullptr);
81 assert(ptr_ !=
nullptr);
82 *ptr_ = deserialize(c);
85 Json serialize(
const Type& x)
const {
return mapping_to_.at(x); }
87 Type deserialize(
const Conf& c)
const {
88 auto s = c.
get<std::string>();
90 return mapping_from_.at(s);
91 }
catch (std::out_of_range& e) {
92 throw this->error(c,
"invalid value for enum: {}", s);
96 void serialize_into(Json& j,
const Type& x)
const { j = mapping_to_.at(x); }
98 void deserialize_into(
const Conf& c, Type& x)
const { x = deserialize(c); }
103 const std::map<T, std::string>& mapping_to_;
104 const std::map<std::string, T>& mapping_from_;
105 std::vector<std::string> keys_;
109 template <
typename T, std::enable_if_t<std::is_enum_v<T>,
int> = 0>
110 inline Enum<T> make_schema(T* ptr, std::string desc) {
111 return Enum<T>(ptr, std::move(desc));
T get() const
Definition: conf.hpp:166
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:75
void reset_ptr() override
Definition: enum.hpp:100
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:80
virtual Json to_json() const
Definition: interface.hpp:254
nlohmann::json Json
Definition: fable_fwd.hpp:35