import json from typing import Any from .collision_rules import sanitize_collision_rules # Déclencheurs D'ÉCRAN (voir _screens._screen_triggers, screens_repo/ # ensure_schema.py) — contrairement à _collision_rules (porté par un # OBJET de scène), ceux-ci se déclenchent sans avoir besoin d'un objet : # demande explicite pour de la narration/cinématique dès l'affichage # d'un écran. Seul déclencheur pour l'instant : "affichage" (à # l'affichage de l'écran) — même forme d'action que collision_rules.py # (dialogue/variable/surbrillance/visibilite/son/video/indication/ # interagir/condition), réutilisée telle quelle plutôt que dupliquée. TRIGGER_TYPES_SCREEN = ["affichage"] def sanitize_screen_triggers(raw_rules: Any) -> list[dict[str, Any]]: """Valide/nettoie une liste de règles "déclencheur d'écran -> action" postée par le client (voir routes/screens/screen_triggers.py) — même garanties que sanitize_collision_rules, juste un vocabulaire de déclencheur restreint à TRIGGER_TYPES_SCREEN.""" return sanitize_collision_rules(raw_rules, allowed_triggers=TRIGGER_TYPES_SCREEN) def resolve_screen_triggers(screen: dict[str, Any] | None) -> list[dict[str, Any]]: """Décode _screens._screen_triggers en liste Python, jamais None — un écran créé avant l'ajout de cette fonctionnalité (colonne NULL) retombe sur aucune règle, même principe que resolve_collision_rules pour un objet.""" raw = (screen or {}).get("_screen_triggers") if not raw: return [] try: parsed = json.loads(raw) except (TypeError, ValueError): return [] return sanitize_screen_triggers(parsed)