25 #ifndef FABLE_SCHEMA_ENUM_HPP_ 26 #define FABLE_SCHEMA_ENUM_HPP_ 30 #include <type_traits> 45 Enum(Type* ptr, std::string&& desc)
47 , mapping_to_(enum_serialization<T>())
48 , mapping_from_(enum_deserialization<T>())
50 keys_.reserve(mapping_to_.size());
51 for (
auto const& kv : mapping_to_) {
52 keys_.emplace_back(kv.second);
57 const std::vector<std::string>& keys()
const {
return keys_; }
65 this->augment_schema(j);
70 std::string s = c.
get<std::string>();
71 if (mapping_from_.count(s) == 0) {
72 this->throw_error(c,
"invalid value for enum: {}", s);
78 assert(ptr_ !=
nullptr);
83 assert(ptr_ !=
nullptr);
84 *ptr_ = deserialize(c);
87 Json serialize(
const Type& x)
const {
return mapping_to_.at(x); }
89 Type deserialize(
const Conf& c)
const {
90 auto s = c.
get<std::string>();
92 return mapping_from_.at(s);
93 }
catch (std::out_of_range& e) {
94 this->throw_error(c,
"invalid value for enum: {}", s);
101 const std::map<T, std::string>& mapping_to_;
102 const std::map<std::string, T>& mapping_from_;
103 std::vector<std::string> keys_;
107 template <typename T, std::enable_if_t<std::is_enum<T>::value,
int> = 0>
108 inline Enum<T> make_schema(T* ptr, std::string&& desc) {
109 return Enum<T>(ptr, std::move(desc));
115 #endif // FABLE_SCHEMA_ENUM_HPP_
Json json_schema() const override
Definition: enum.hpp:60
void reset_ptr() override
Definition: enum.hpp:98
T get() const
Definition: conf.hpp:164
void from_conf(const Conf &c) override
Definition: enum.hpp:82
nlohmann::json Json
Definition: json.hpp:62
void to_json(Json &j) const override
Definition: enum.hpp:77
virtual Json to_json() const
Definition: interface.hpp:220
void validate(const Conf &c) const override
Definition: enum.hpp:69
Definition: interface.hpp:354
std::string type_string() const override
Definition: interface.hpp:366