import 'package:dartz/dartz.dart'; /// 실패 처리를 위한 추상 클래스 abstract class Failure { final String message; final String? code; const Failure({ required this.message, this.code, }); @override bool operator ==(Object other) => identical(this, other) || other is Failure && runtimeType == other.runtimeType && message == other.message && code == other.code; @override int get hashCode => message.hashCode ^ code.hashCode; } /// 서버 실패 class ServerFailure extends Failure { final int? statusCode; final Map? errors; const ServerFailure({ required String message, String? code, this.statusCode, this.errors, }) : super(message: message, code: code); } /// 캐시 실패 class CacheFailure extends Failure { const CacheFailure({ required String message, String? code, }) : super(message: message, code: code); } /// 네트워크 실패 class NetworkFailure extends Failure { const NetworkFailure({ required String message, String? code, }) : super(message: message, code: code); } /// 인증 실패 class AuthenticationFailure extends Failure { const AuthenticationFailure({ required String message, String? code, }) : super(message: message, code: code); } /// 권한 실패 class AuthorizationFailure extends Failure { const AuthorizationFailure({ required String message, String? code, }) : super(message: message, code: code); } /// 유효성 검사 실패 class ValidationFailure extends Failure { final Map>? fieldErrors; const ValidationFailure({ required String message, String? code, this.fieldErrors, }) : super(message: message, code: code); } /// 리소스 찾을 수 없음 실패 class NotFoundFailure extends Failure { final String? resourceType; final String? resourceId; const NotFoundFailure({ required String message, String? code, this.resourceType, this.resourceId, }) : super(message: message, code: code); } /// 중복 리소스 실패 class DuplicateFailure extends Failure { final String? field; final String? value; const DuplicateFailure({ required String message, String? code, this.field, this.value, }) : super(message: message, code: code); } /// 비즈니스 로직 실패 class BusinessFailure extends Failure { const BusinessFailure({ required String message, String? code, }) : super(message: message, code: code); } /// 타입 정의 typedef FutureEither = Future>; typedef FutureVoid = FutureEither;