EastSync-AI / utils /pydantic_to_template.py
StanSava's picture
cleanup UI (#5)
d6e5a14
from pydantic import BaseModel
from typing import get_origin, get_args, List, Dict, Optional, Union
from datetime import datetime
def pydantic_to_template(model: type[BaseModel]):
"""
Recursively converts a pydantic model class into
a minimal JSON template (dict).
"""
fields = {}
for name, field in model.model_fields.items():
fields[name] = type_to_template(field.annotation)
return fields
def type_to_template(annotation):
origin = get_origin(annotation)
# Optional[T] / Union[T, None] -> T
# Handles both typing.Optional[T] and the newer `T | None` syntax
if origin is Union:
args = [arg for arg in get_args(annotation) if arg is not type(None)]
if len(args) == 1:
annotation = args[0]
origin = get_origin(annotation)
# List[T]
if origin is list or origin is List:
inner = get_args(annotation)[0]
return [type_to_template(inner)]
# Dict[str, T]
if origin is dict or origin is Dict:
inner = get_args(annotation)[1]
return {"string": type_to_template(inner)}
# Pydantic model
if isinstance(annotation, type) and issubclass(annotation, BaseModel):
return pydantic_to_template(annotation)
# Primitive types
if annotation in [str, int, float]:
if annotation is str:
return "string"
if annotation is int:
return 'int'
if annotation is float:
return 'float'
# datetime
if annotation is datetime:
return 'datetime'
# Fallback
return 'any'