27 bpo::options_description uniqueOptions;
28 std::set<std::string> uniqueNames;
29 std::map<std::string, std::string> optionDefaults;
30 for (
auto& option : od.options()) {
31 if (uniqueNames.find(option->format_name()) == uniqueNames.end()) {
32 uniqueOptions.add(option);
33 uniqueNames.insert(option->format_name());
34 boost::any defaultValue;
35 option->semantic()->apply_default(defaultValue);
37 if (defaultValue.type() ==
typeid(std::string)) {
38 optionDefaults.insert({option->format_name(), boost::any_cast<std::string>(defaultValue)});
40 optionDefaults.insert({option->format_name(),
"not a string"});
43 if (option->semantic()->max_tokens() == 1) {
44 LOG(
debug) <<
"Option " << option->format_name() <<
" is already defined, skipping";
45 boost::any defaultValue1;
46 option->semantic()->apply_default(defaultValue1);
47 if (defaultValue1.type() !=
typeid(std::string)) {
48 LOGP(error,
"Option {} is already defined but it's not a string, please fix it. Actualy type {}", option->format_name(), defaultValue1.type().name());
50 auto defaultValueStr1 = boost::any_cast<std::string>(defaultValue1);
51 auto defaultValueStr2 = optionDefaults.at(option->format_name());
52 if (defaultValueStr2 ==
"not a string") {
53 LOGP(error,
"{} is duplicate but strings are the only supported duplicate values", option->format_name());
55 if (defaultValueStr1 != defaultValueStr2) {
56 LOGP(error,
"Option {} has different default values: {} and {}", option->format_name(), defaultValueStr1, defaultValueStr2);