diff --git a/config_convert/utils/schema.py b/config_convert/utils/schema.py new file mode 100644 index 0000000..8724474 --- /dev/null +++ b/config_convert/utils/schema.py @@ -0,0 +1,51 @@ +"""JSON Schema generation from parsed configurations.""" + +from typing import Any, Dict, List, Union + + +def generate_schema(data: Any) -> Dict[str, Any]: + """Generate a JSON Schema from a parsed configuration. + + Args: + data: The parsed configuration data + + Returns: + A dictionary representing the JSON Schema + """ + schema: Dict[str, Any] = { + "$schema": "http://json-schema.org/draft-07/schema#", + "type": _infer_type(data), + } + + if isinstance(data, dict): + schema["properties"] = {} + for key, value in data.items(): + schema["properties"][key] = generate_schema(value) + + elif isinstance(data, list): + if len(data) > 0: + schema["items"] = generate_schema(data[0]) + else: + schema["items"] = {"type": "string"} + + return schema + + +def _infer_type(data: Any) -> str: + """Infer the JSON Schema type from a Python value.""" + if data is None: + return "null" + elif isinstance(data, bool): + return "boolean" + elif isinstance(data, int): + return "integer" + elif isinstance(data, float): + return "number" + elif isinstance(data, str): + return "string" + elif isinstance(data, list): + return "array" + elif isinstance(data, dict): + return "object" + else: + return "string"