json: support tuple types ([number, string])

This commit is contained in:
ochafik 2024-03-01 14:12:46 +00:00
parent 09248e0897
commit 2d9580a37b

View file

@ -86,24 +86,33 @@ class SchemaConverter:
elif schema_type == 'array' and 'items' in schema: elif schema_type == 'array' and 'items' in schema:
# TODO `prefixItems` keyword # TODO `prefixItems` keyword
item_rule_name = self.visit(schema['items'], f'{name}{"-" if name else ""}item') items = schema['items']
list_item_operator = f'("," space {item_rule_name})' if isinstance(items, list):
successive_items = "" return self._add_rule(
min_items = schema.get("minItems", 0) rule_name,
max_items = schema.get("maxItems") '"[" space ' +
if min_items > 0: ' "," space '.join(
successive_items = list_item_operator * (min_items - 1) self.visit(item, f'{name}-{i}')
min_items -= 1 for i, item in enumerate(items)) +
if max_items is not None and max_items > min_items: ' "]" space')
successive_items += (list_item_operator + "?") * (max_items - min_items - 1)
else: else:
successive_items += list_item_operator + "*" item_rule_name = self.visit(items, f'{name}{"-" if name else ""}item')
if min_items == 0: list_item_operator = f'("," space {item_rule_name})'
rule = f'"[" space ({item_rule_name} {successive_items})? "]" space' successive_items = ""
else: min_items = schema.get("minItems", 0)
rule = f'"[" space {item_rule_name} {successive_items} "]" space' max_items = schema.get("maxItems")
return self._add_rule(rule_name, rule) if min_items > 0:
successive_items = list_item_operator * (min_items - 1)
min_items -= 1
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 + "*"
if min_items == 0:
rule = f'"[" space ({item_rule_name} {successive_items})? "]" space'
else:
rule = f'"[" space {item_rule_name} {successive_items} "]" space'
return self._add_rule(rule_name, rule)
else: else:
assert schema_type in PRIMITIVE_RULES, f'Unrecognized schema: {schema}' assert schema_type in PRIMITIVE_RULES, f'Unrecognized schema: {schema}'
return self._add_rule( return self._add_rule(