def compute_new_value(operation, current, raw_value, is_decimal): """Calcule la nouvelle valeur d'un champ d'objet ou d'une variable globale pour une opération de DATA_OPERATIONS (voir screens/labels/data_operations.py) — logique partagée par apply_data_action.py (champ d'objet) et apply_variable_action.py (variable globale), qui ne diffèrent que par l'origine de `current` et la façon dont le résultat est persisté. `is_decimal` : True pour un champ/une variable de type "nombre_decimal" (résultat numérique gardé en flottant), False sinon (résultat toujours entier). Lève ValueError si `operation` n'est pas reconnue — à l'appelant de la traduire en son propre échec (ex. `return False`).""" if operation == "definir_texte": return raw_value or "" if operation == "definir_nombre": try: return float(raw_value) if is_decimal else int(float(raw_value)) except (TypeError, ValueError): return 0 if operation == "definir_bool_vrai": return 1 if operation == "definir_bool_faux": return 0 if operation == "basculer_bool": return 0 if current else 1 if operation in ("incrementer", "decrementer"): try: amount = float(raw_value) if raw_value not in (None, "") else 0 except (TypeError, ValueError): amount = 0 if operation == "decrementer": amount = -amount result = (current or 0) + amount return result if is_decimal else int(result) raise ValueError(f"opération inconnue : {operation!r}")