"""Shared helper utilities for per-item behavior modules.""" from __future__ import annotations def parse_bool_like(value: object, *, default: bool = True) -> bool: """Parse permissive bool-like values used by item params.""" if isinstance(value, bool): return value if isinstance(value, (int, float)): return bool(value) if isinstance(value, str): token = value.strip().lower() if token in {"on", "true", "1", "yes"}: return True if token in {"off", "false", "0", "no"}: return False return default def parse_bool_like_or_none(value: object) -> bool | None: """Parse permissive bool-like values, returning None when invalid.""" if isinstance(value, bool): return value if isinstance(value, (int, float)): return bool(value) if isinstance(value, str): token = value.strip().lower() if token in {"on", "true", "1", "yes"}: return True if token in {"off", "false", "0", "no"}: return False return None def toggle_bool_param(params: dict, key: str, *, default: bool = True) -> bool: """Toggle a bool-like item param key and return the next value.""" current = parse_bool_like(params.get(key), default=default) return not current def keep_only_known_params(params: dict, allowed_keys: tuple[str, ...]) -> dict: """Return a copy containing only explicitly allowed item param keys.""" allowed = set(allowed_keys) return {key: value for key, value in params.items() if key in allowed}