"""Dataclass to dict serializer for JSON responses.""" from __future__ import annotations import dataclasses import math from typing import Any import numpy as np def to_dict(obj: Any) -> Any: """Recursively convert dataclass instances to dicts, handling numpy types.""" if obj is None: return None if dataclasses.is_dataclass(obj) and not isinstance(obj, type): return {k: to_dict(v) for k, v in dataclasses.asdict(obj).items()} if isinstance(obj, dict): return {k: to_dict(v) for k, v in obj.items()} if isinstance(obj, (list, tuple)): return [to_dict(item) for item in obj] if isinstance(obj, np.ndarray): return obj.tolist() if isinstance(obj, (np.integer,)): return int(obj) if isinstance(obj, (np.floating,)): v = float(obj) if math.isnan(v) or math.isinf(v): return 0.0 return v if isinstance(obj, (np.bool_,)): return bool(obj) if isinstance(obj, float): if math.isnan(obj) or math.isinf(obj): return 0.0 return obj