@@ -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