import 'package:equatable/equatable.dart'; /// Base failure type for the application. /// /// Uses a sealed class hierarchy so `switch` expressions are exhaustive. sealed class Failure extends Equatable { final String message; const Failure(this.message); @override List get props => [message]; } /// Returned when the backend API responds with a non-2xx status. class ServerFailure extends Failure { final int? statusCode; const ServerFailure(super.message, {this.statusCode}); @override List get props => [message, statusCode]; } /// Returned when the device has no network connectivity. class NetworkFailure extends Failure { const NetworkFailure([super.message = 'No internet connection. Your changes are saved locally.']); } /// Returned when reading / writing the local cache fails. class CacheFailure extends Failure { const CacheFailure([super.message = 'Could not access local storage.']); } /// Returned for authentication problems (expired token, bad credentials, etc.). class AuthFailure extends Failure { const AuthFailure([super.message = 'Authentication failed. Please sign in again.']); } /// Returned when user input does not pass validation. class ValidationFailure extends Failure { final Map fieldErrors; const ValidationFailure(super.message, {this.fieldErrors = const {}}); @override List get props => [message, fieldErrors]; }