From 82ade9f558ac8a88ddbeeda5d92c143da76e5d2f Mon Sep 17 00:00:00 2001 From: ochafik Date: Fri, 1 Mar 2024 19:04:42 +0000 Subject: [PATCH] join: support union types (mostly for nullable types I think) --- examples/json-schema-to-grammar.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/examples/json-schema-to-grammar.py b/examples/json-schema-to-grammar.py index 7003e389b..1be8305fe 100755 --- a/examples/json-schema-to-grammar.py +++ b/examples/json-schema-to-grammar.py @@ -62,6 +62,12 @@ class SchemaConverter: except KeyError as e: raise Exception(f'Error resolving ref {ref}: {e}') from e + def _generate_union_rule(self, name, alt_schemas): + return ' | '.join(( + self.visit(alt_schema, f'{name}{"-" if name else ""}{i}') + for i, alt_schema in enumerate(alt_schemas) + )) + def _visit_pattern(self, pattern): assert pattern.startswith('^') and pattern.endswith('$'), 'Pattern must start with "^" and end with "$"' pattern = pattern[1:-1] @@ -126,11 +132,10 @@ class SchemaConverter: rule_name = name or 'root' if 'oneOf' in schema or 'anyOf' in schema: - rule = ' | '.join(( - self.visit(alt_schema, f'{name}{"-" if name else ""}{i}') - for i, alt_schema in enumerate(schema.get('oneOf') or schema['anyOf']) - )) - return self._add_rule(rule_name, rule) + return self._add_rule(rule_name, self._generate_union_rule(name, schema.get('oneOf') or schema['anyOf'])) + + elif isinstance(schema_type, list): + return self._add_rule(rule_name, self._generate_union_rule(name, [{'type': t} for t in schema_type])) elif 'const' in schema: return self._add_rule(rule_name, self._format_literal(schema['const']))