| void validate(std::string_view) {} | void validate(std::string_view) {} | ||||
| }; | }; | ||||
| class reject_unknown { | |||||
| public: | |||||
| int read_one(std::string_view context, std::string_view key, std::string_view) const { | |||||
| throw std::runtime_error(std::string(context) + ": Unknown key '" + std::string(key) + "'"); | |||||
| } | |||||
| void validate(std::string_view) {} | |||||
| }; | |||||
| template <typename... Items> | template <typename... Items> | ||||
| auto read(std::string_view context [[maybe_unused]], const pair_list& pairs, Items... is) { | |||||
| auto read(std::string_view context[[maybe_unused]], const pair_list& pairs, Items... is) { | |||||
| std::vector<pair> bad_pairs; | std::vector<pair> bad_pairs; | ||||
| for (auto [key, value] : pairs.items()) { | for (auto [key, value] : pairs.items()) { | ||||
| auto nread = (is.read_one(context, key, value) + ... + 0); | |||||
| if (nread == 0) { | |||||
| auto did_read = (is.read_one(context, key, value) || ...); | |||||
| if (did_read) { | |||||
| bad_pairs.emplace_back(key, value); | bad_pairs.emplace_back(key, value); | ||||
| } | } | ||||
| } | } |