Expand description
Work report DTOs — les montants utilisent rust_decimal::Decimal (ADR-0007/0008).
Deux notes qui expliquent les attributs serde ci-dessous :
-
validatorne sait pas borner unDecimal(#[validate(range(...))]n’accepte que des littéraux flottants). L’invariant « coût ≥ 0 » descend donc dans le domaine —WorkReport::new/WorkReport::set_cost— où il couvre tous les appelants et plus seulement la route HTTP. -
Un
Decimalnu sérialise en chaîne JSON ("1500.00"), là où le type d’avant produisait un nombre (1500.0).serde::float/serde::float_optionpréservent la représentation numérique : la conversion ne provoque donc AUCUN drift de contrat API. Ledefaultsur les champs optionnels est indispensable :#[serde(with = ...)]fait perdre le défaut implicite d’unOptionabsent, et uncostomis dans une mise à jour partielle deviendrait un 400 « missing field ».