Forward compatibility - config substitutions:

1) Verify whether a value looks like an enum
2) Always report substitution of an enum with a boolean.
This commit is contained in:
bubnikv 2021-06-30 16:19:06 +02:00 committed by Vojtech Bubnik
parent 4fa651456d
commit c7691ec95e
2 changed files with 16 additions and 3 deletions

View File

@ -506,6 +506,16 @@ void ConfigBase::set_deserialize(std::initializer_list<SetDeserializeItem> items
this->set_deserialize(item.opt_key, item.opt_value, substitutions_ctxt, item.append);
}
static inline bool looks_like_enum_value(const std::string &s)
{
if (value.empty() || value.size() > 64 || ! isalpha(value.front()))
return false;
for (const char c : s)
if (! (isalnum(c) || c == '_' || c == '-'))
return false;
return true;
}
bool ConfigBase::set_deserialize_raw(const t_config_option_key &opt_key_src, const std::string &value, ConfigSubstitutionContext& substitutions_ctxt, bool append)
{
t_config_option_key opt_key = opt_key_src;
@ -551,7 +561,10 @@ bool ConfigBase::set_deserialize_raw(const t_config_option_key &opt_key_src, con
// Deserialize failed, try to substitute with a default value.
assert(substitutions_ctxt.rule == ForwardCompatibilitySubstitutionRule::Enable || substitutions_ctxt.rule == ForwardCompatibilitySubstitutionRule::EnableSilent);
opt->set(optdef->default_value.get());
if (optdef->type == coBool && looks_like_enum_value(value))
static_cast<ConfigOptionBool*>(opt)->value = boost::iequals(value, "enabled") || boost::iequals(value, "on");
else
opt->set(optdef->default_value.get());
if (substitutions_ctxt.rule == ForwardCompatibilitySubstitutionRule::Enable ||
substitutions_ctxt.rule == ForwardCompatibilitySubstitutionRule::EnableSystemSilent) {

View File

@ -1330,11 +1330,11 @@ public:
bool deserialize(const std::string &str, bool append = false) override
{
UNUSED(append);
if (str == "1" || boost::iequals(str, "enabled") || boost::iequals(str, "on")) {
if (str == "1") {
this->value = true;
return true;
}
if (str == "0" || boost::iequals(str, "disabled") || boost::iequals(str, "off")) {
if (str == "0") {
this->value = false;
return true;
}