Skip to content

Commit f9ef2ef

Browse files
committed
Only check for extra keys in strict mode
1 parent 7c39c01 commit f9ef2ef

File tree

1 file changed

+14
-12
lines changed

1 file changed

+14
-12
lines changed

src/jse/jse.cpp

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ namespace jse
200200
for (int i = 0; i < verified_matching_rules.size(); i++)
201201
s << i << ": " << verified_matching_rules[i].dump(/*indent=*/4) << "\n";
202202
log.push_back(log_item("error", s.str()));
203-
return false;
203+
return !strict; // if not strict, we do not check for extra keys to distinguish between rules
204204
}
205205
const json &single_matched_rule = verified_matching_rules.front();
206206

@@ -427,18 +427,20 @@ namespace jse
427427
if (!input.contains(string(e)))
428428
return false;
429429

430-
std::vector<std::string> keys;
431-
keys.reserve((rule.contains("required") ? rule["required"].size() : 0)
432-
+ (rule.contains("optional") ? rule["optional"].size() : 0));
433-
if (rule.contains("required"))
434-
keys.insert(keys.end(), rule["required"].begin(), rule["required"].end());
435-
if (rule.contains("optional"))
436-
keys.insert(keys.end(), rule["optional"].begin(), rule["optional"].end());
430+
if (strict) // strict mode: check that no extra fields are present
431+
{
432+
std::vector<std::string> keys;
433+
keys.reserve((rule.contains("required") ? rule["required"].size() : 0)
434+
+ (rule.contains("optional") ? rule["optional"].size() : 0));
435+
if (rule.contains("required"))
436+
keys.insert(keys.end(), rule["required"].begin(), rule["required"].end());
437+
if (rule.contains("optional"))
438+
keys.insert(keys.end(), rule["optional"].begin(), rule["optional"].end());
437439

438-
// Check that no extra fields are present
439-
for (const auto &[key, value] : input.items())
440-
if (std::find(keys.begin(), keys.end(), key) == keys.end())
441-
return false;
440+
for (const auto &[key, value] : input.items())
441+
if (std::find(keys.begin(), keys.end(), key) == keys.end())
442+
return false;
443+
}
442444

443445
if (rule.contains("type_name")
444446
&& (!input.contains("type") || input["type"] != rule["type_name"]))

0 commit comments

Comments
 (0)