feat: support minItems/maxItems in JSON grammar converter (by @nopperl)

This commit is contained in:
Andrei Betlen 2024-02-22 00:17:06 -05:00
parent e6d6260a91
commit 3921e10770

View file

@ -1498,9 +1498,21 @@ class SchemaConverter:
item_rule_name = self.visit( item_rule_name = self.visit(
schema["items"], f'{name}{"-" if name else ""}item' schema["items"], f'{name}{"-" if name else ""}item'
) )
rule = ( list_item_operator = f'("," space {item_rule_name})'
f'"[" space ({item_rule_name} ("," space {item_rule_name})*)? "]" space' successive_items = ""
) min_items = schema.get("minItems", 0)
if min_items > 0:
first_item = f"({item_rule_name})"
successive_items = list_item_operator * (min_items - 1)
min_items -= 1
else:
first_item = f"({item_rule_name})?"
max_items = schema.get("maxItems")
if max_items is not None and max_items > min_items:
successive_items += (list_item_operator + "?") * (max_items - min_items - 1)
else:
successive_items += list_item_operator + "*"
rule = f'"[" space {first_item} {successive_items} "]" space'
return self._add_rule(rule_name, rule) return self._add_rule(rule_name, rule)
else: else: