from __future__ import annotations from typing import Any, Dict, List def collect_enums(schema: Dict[str, Any]) -> Dict[str, List[str]]: enums: Dict[str, List[str]] = {} def _walk(subschema: Dict[str, Any], path: List[str]) -> None: if "enum" in subschema and isinstance(subschema["enum"], list): enums["".join(path)] = [str(v) for v in subschema["enum"]] if subschema.get("type") == "object": props = subschema.get("properties", {}) for key, child in props.items(): _walk(child, path + [f".{key}"]) if subschema.get("type") == "array": items = subschema.get("items") if isinstance(items, dict): _walk(items, path + ["[0]"]) _walk(schema, []) return enums def collect_formats(schema: Dict[str, Any]) -> Dict[str, str]: fmts: Dict[str, str] = {} def _walk(subschema: Dict[str, Any], path: List[str]) -> None: if "format" in subschema: fmts["".join(path)] = subschema["format"] if subschema.get("type") == "object": for key, child in subschema.get("properties", {}).items(): _walk(child, path + [f".{key}"]) if subschema.get("type") == "array": items = subschema.get("items") if isinstance(items, dict): _walk(items, path + ["[0]"]) _walk(schema, []) return fmts def collect_ranges(schema: Dict[str, Any]) -> Dict[str, Dict[str, Any]]: ranges: Dict[str, Dict[str, Any]] = {} def _walk(subschema: Dict[str, Any], path: List[str]) -> None: for k in ["minimum", "maximum", "minLength", "maxLength", "pattern"]: if k in subschema: ranges.setdefault("".join(path), {})[k] = subschema[k] if subschema.get("type") == "object": for key, child in subschema.get("properties", {}).items(): _walk(child, path + [f".{key}"]) if subschema.get("type") == "array": items = subschema.get("items") if isinstance(items, dict): _walk(items, path + ["[0]"]) _walk(schema, []) return ranges