/// Types d'échec métier du domaine. /// /// Les features ajoutent leurs propres sous-types en étendant [Failure]. /// Les exceptions techniques (réseau, IO) sont capturées dans la couche data /// et converties en [Failure] avant de remonter. sealed class Failure { const Failure(this.message); final String message; @override bool operator ==(Object other) => other is Failure && other.runtimeType == runtimeType && other.message == message; @override int get hashCode => Object.hash(runtimeType, message); @override String toString() => '$runtimeType($message)'; } /// Erreur de communication réseau (timeout, pas de connectivité, HTTP 5xx…). final class NetworkFailure extends Failure { const NetworkFailure(super.message); } /// Ressource demandée introuvable (HTTP 404, entité absente en base…). final class NotFoundFailure extends Failure { const NotFoundFailure(super.message); } /// Erreur inattendue non catégorisée — à affiner si elle se répète. final class UnexpectedFailure extends Failure { const UnexpectedFailure(super.message); }