import 'package:storytime/core/error/failure.dart'; /// Résultat d'une opération qui peut échouer. /// /// - [Ok] : succès avec une valeur de type [S]. /// - [Err] : échec avec un [Failure] typé. /// /// Utilisé par les use cases pour renvoyer succès ou erreur sans lever /// d'exception à travers les couches. sealed class Result { const Result(); /// Transforme la valeur en cas de succès ; laisse [Err] intact. Result map(T Function(S value) transform) => switch (this) { Ok(:final value) => Ok(transform(value)), Err(:final failure) => Err(failure), }; /// Réduit le résultat à une valeur unique en fournissant les deux branches. T fold({ required T Function(S value) onOk, required T Function(Failure failure) onErr, }) => switch (this) { Ok(:final value) => onOk(value), Err(:final failure) => onErr(failure), }; /// Exécute un effet de bord selon la branche, sans retourner de valeur. void when({ required void Function(S value) ok, required void Function(Failure failure) err, }) { switch (this) { case Ok(:final value): ok(value); case Err(:final failure): err(failure); } } } /// Cas succès. final class Ok extends Result { const Ok(this.value); final S value; @override bool operator ==(Object other) => other is Ok && other.value == value; @override int get hashCode => value.hashCode; @override String toString() => 'Ok($value)'; } /// Cas échec. final class Err extends Result { const Err(this.failure); final Failure failure; @override bool operator ==(Object other) => other is Err && other.failure == failure; @override int get hashCode => failure.hashCode; @override String toString() => 'Err($failure)'; }