"""Utility helpers for the DITAv2 kernel.""" from __future__ import annotations from dataclasses import asdict, is_dataclass from datetime import datetime from enum import Enum from typing import Any import json import math def safe_float(value: Any, default: float = 0.0) -> float: """Return a finite float or ``default``.""" try: out = float(value) except Exception: return default if not math.isfinite(out): return default return out def json_safe(value: Any) -> Any: """Convert enums, dataclasses and datetimes to JSON-safe objects.""" if isinstance(value, Enum): return value.value if isinstance(value, datetime): return value.isoformat() if is_dataclass(value): return json_safe(asdict(value)) if isinstance(value, dict): return {str(key): json_safe(val) for key, val in value.items()} if isinstance(value, list): return [json_safe(item) for item in value] if isinstance(value, tuple): return [json_safe(item) for item in value] return value def json_text(value: Any) -> str: """Serialize a value using stable JSON settings.""" return json.dumps(json_safe(value), separators=(",", ":"), ensure_ascii=False, default=str)