+namespace
+{
+ std::string ShowRules(const std::vector<std::pair<std::string, AttrValue>>& attributes)
+ {
+ std::string result;
+ for (const auto& at : attributes)
+ {
+ if (!result.empty())
+ result += ", ";
+
+ if (at.second.type == AttrValue::Type::PARAM_NAME)
+ result.append(at.first + " = " + at.second.value);
+ else
+ result.append(at.first + " = '" + at.second.value + "'");
+ }
+ return result;
+ }
+}
+
+std::vector<std::pair<std::string, AttrValue>> RAD_SETTINGS::ParseRules(const std::string& value, const std::string& paramName)
+{
+ using tokenizer = boost::tokenizer<boost::char_separator<char>>;
+ const boost::char_separator<char> sep(",");
+
+ const tokenizer tokens(value, sep);
+
+ std::vector<std::pair<std::string, AttrValue>> res;
+ for (const auto& token : tokens)
+ {
+ const boost::char_separator<char> sp(" =");
+ const tokenizer tok(token, sp);
+
+ std::vector<std::string> keyValue;
+ for (const auto& t : tok)
+ keyValue.push_back(t);
+
+ if (keyValue.size() != 2)
+ {
+ m_logger("The '%s' attribute specification has an incorrect format: '%s'.", paramName.c_str(), token.c_str());
+ printfd(__FILE__, "The '%s' attribute specification has an incorrect format: '%s'.", paramName.c_str(), token.c_str());
+ return {};
+ }
+
+ auto type = AttrValue::Type::PARAM_NAME;
+ std::string valueName = keyValue[1];
+ if (valueName.front() == '\'' && valueName.back() == '\'')
+ {
+ type = AttrValue::Type::VALUE;
+ valueName.erase(0, 1);
+ valueName.erase(valueName.length() - 1, 1);
+ }
+ else if ((valueName.front() == '\'' && valueName.back() != '\'') || (valueName.front() != '\'' && valueName.back() == '\''))
+ {
+ m_logger("Error ParseRules: '%s' attribute parameter value is invalid.\n", paramName.c_str());
+ printfd(__FILE__, "Error ParseRules: '%s' attribute parameter value is invalid.\n", paramName.c_str());
+ return {};
+ }
+ res.emplace_back(keyValue[0], AttrValue{valueName, type});
+ }
+ return res;
+}
+
+ASection RAD_SETTINGS::parseASection(const std::vector<ParamValue>& conf)
+{
+ ASection res;
+ const auto mit = std::find(conf.begin(), conf.end(), ParamValue("match", {}));
+ if (mit != conf.end())
+ res.match = ParseRules(mit->value[0], mit->param);
+
+ const auto sit = std::find(conf.begin(), conf.end(), ParamValue("send", {}));
+ if (sit != conf.end())
+ res.send = ParseRules(sit->value[0], sit->param);
+
+ return res;
+}
+