import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/core/error/set_error.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:model/error_type_handler/set_method_error_handler_mixin.dart'; mixin HandleSetErrorMixin { void handleSetErrors({ SetMethodErrors? notDestroyedError, SetMethodErrors? notUpdatedError, SetMethodErrors? notCreatedError, Set? notDestroyedHandlers, Set? notUpdatedHandlers, Set? notCreatedHandlers, SetMethodErrorHandler? unCatchErrorHandler }) { if (notDestroyedError != null && notDestroyedError.isNotEmpty) { notDestroyedError.entries .map((e) => _handleInChain(e, notDestroyedHandlers)) .map((optionError) => _handleRemainedError(unCatchErrorHandler, optionError)) .toSet(); } if (notCreatedError != null && notCreatedError.isNotEmpty) { notCreatedError.entries .map((e) => _handleInChain(e, notCreatedHandlers)) .map((optionError) => _handleRemainedError(unCatchErrorHandler, optionError)) .toSet(); } if (notUpdatedError != null && notUpdatedError.isNotEmpty) { notUpdatedError.entries .map((e) => _handleInChain(e, notUpdatedHandlers)) .map((optionError) => _handleRemainedError(unCatchErrorHandler, optionError)) .toSet(); } } Option> _handleInChain(MapEntry setError, Set? handlers) { try { handlers!.firstWhere((handler) => handler.call(setError)); return const None>(); } catch (e) { logError('HandleSetErrorMixin::chainHandle(): [Exception] $e'); return Some>(setError); } } void _handleRemainedError(SetMethodErrorHandler? unCatchErrorHandler, Option> optionError) { final remainedError = optionError.toNullable(); if (remainedError != null) { logError('HandleSetErrorMixin::_handleRemainedError(): $remainedError'); unCatchErrorHandler?.call(remainedError); } } }