From fce0e6a73b380922f8e8db964bc4066939af4934 Mon Sep 17 00:00:00 2001 From: Minyewoo Date: Mon, 19 Dec 2022 14:38:10 +0300 Subject: [PATCH] Added basic failure, tested it --- lib/src/core/entities/ds_command.dart | 2 +- lib/src/core/entities/ds_data_class.dart | 2 +- lib/src/core/entities/ds_data_type.dart | 2 +- lib/src/core/entities/ds_status.dart | 4 +- lib/src/core/entities/ds_timestamp.dart | 2 +- lib/src/core/error/failure.dart | 86 +++++++----------------- test/unit/core/failure_test.dart | 26 +++++++ 7 files changed, 57 insertions(+), 67 deletions(-) create mode 100644 test/unit/core/failure_test.dart diff --git a/lib/src/core/entities/ds_command.dart b/lib/src/core/entities/ds_command.dart index c1280ca..5d05673 100644 --- a/lib/src/core/entities/ds_command.dart +++ b/lib/src/core/entities/ds_command.dart @@ -43,7 +43,7 @@ class DsCommand { } catch (error) { log(true, '[$DsCommand.fromJson] error: $error\njson: $json'); // log(ug, '[$DsCommand.fromJson] dataPoint: $dataPoint'); - throw Failure.convertion( + throw Failure( message: 'Ошибка в методе $DsCommand.fromJson() $error', stackTrace: StackTrace.current, ); diff --git a/lib/src/core/entities/ds_data_class.dart b/lib/src/core/entities/ds_data_class.dart index 844f8ba..066c820 100644 --- a/lib/src/core/entities/ds_data_class.dart +++ b/lib/src/core/entities/ds_data_class.dart @@ -33,7 +33,7 @@ enum DsDataClass { factory DsDataClass.fromString(String value) { final dataClass = _valueMapping[value]; if (dataClass == null) { - throw Failure.connection( + throw Failure( message: 'Ошибка в методе $DsDataClass.fromString: неизвестный класс комманды "$value"', stackTrace: StackTrace.current, ); diff --git a/lib/src/core/entities/ds_data_type.dart b/lib/src/core/entities/ds_data_type.dart index 0ee6f68..5a0495e 100644 --- a/lib/src/core/entities/ds_data_type.dart +++ b/lib/src/core/entities/ds_data_type.dart @@ -23,7 +23,7 @@ enum DsDataType { final lvalue = value.toLowerCase(); final dataType = _valueMapping[lvalue]; if (dataType == null) { - throw Failure.connection( + throw Failure( message: 'Ошибка в методе $DsDataType._extract: неизвестный тип данных $value', stackTrace: StackTrace.current, ); diff --git a/lib/src/core/entities/ds_status.dart b/lib/src/core/entities/ds_status.dart index 3013f78..660ddcd 100644 --- a/lib/src/core/entities/ds_status.dart +++ b/lib/src/core/entities/ds_status.dart @@ -19,7 +19,7 @@ enum DsStatus { if (parsedValue != null) { return DsStatus.fromValue(parsedValue); } else { - throw Failure.connection( + throw Failure( message: 'Ошибка в методе $DsStatus.fromString: int.parse.error значение: "$rawValue"', stackTrace: StackTrace.current, @@ -30,7 +30,7 @@ enum DsStatus { factory DsStatus.fromValue(int code) { final status = _valueMapping[code]; if (status == null) { - throw Failure.connection( + throw Failure( message: 'Ошибка в методе $DsStatus.fromString: неизвестный статус "$code"', stackTrace: StackTrace.current, diff --git a/lib/src/core/entities/ds_timestamp.dart b/lib/src/core/entities/ds_timestamp.dart index 182b92c..94dcbd8 100644 --- a/lib/src/core/entities/ds_timestamp.dart +++ b/lib/src/core/entities/ds_timestamp.dart @@ -28,7 +28,7 @@ class DsTimeStamp { if (dateTime != null) { return DsTimeStamp(dateTime: dateTime); } else { - throw Failure.convertion( + throw Failure( message: 'Ошибка в методе $DsTimeStamp.parse: Недопустимый формат метки времени в:\n\t$value', stackTrace: StackTrace.current, ); diff --git a/lib/src/core/error/failure.dart b/lib/src/core/error/failure.dart index 9ee7b8a..6d3d91f 100644 --- a/lib/src/core/error/failure.dart +++ b/lib/src/core/error/failure.dart @@ -1,63 +1,27 @@ -import 'package:hmi_core/src/core/log/log.dart'; +/// Basic failure with chaining support. +/// Example: +/// ``` +/// const Failure( +/// message: 'Outer message', +/// failure: const Failure( +/// message: 'Inner message', +/// ), +/// ); +/// ``` +class Failure implements Exception { + final String message; + final StackTrace? stackTrace; + final Failure? failure; + const Failure({ + required this.message, + this.stackTrace, + this.failure, + }); -class Failure { - static const _debug = true; - late T message; -/// -/// Ganeral Failures - Failure({ - required T message, - required StackTrace stackTrace, - }) { - log(_debug, message); - log(_debug, stackTrace); - // throw UnimplementedError(message.toString()); + @override + String toString() { + final subfailureString = (failure != null) + ? '\n\tsubfailure: ${failure.toString()}' : ''; + return '$Failure: $message' + subfailureString; } - // - // dataSource failure - factory Failure.dataSource({ - required T message, - required StackTrace stackTrace, - }) => Failure(message: message, stackTrace: stackTrace); - // - // dataObject failure - factory Failure.dataObject({ - required T message, - required StackTrace stackTrace, - }) => Failure(message: message, stackTrace: stackTrace); - // - // dataCollection failure - factory Failure.dataCollection({ - required T message, - required StackTrace stackTrace, - }) => Failure(message: message, stackTrace: stackTrace); - // - // auth failure - factory Failure.auth({ - required T message, - required StackTrace stackTrace, - }) => Failure(message: message, stackTrace: stackTrace); - // - // convertion failure - factory Failure.convertion({ - required T message, - required StackTrace stackTrace, - }) => Failure(message: message, stackTrace: stackTrace); - // - // Connection failure - factory Failure.connection({ - required T message, - required StackTrace stackTrace, - }) => Failure(message: message, stackTrace: stackTrace); - // Translation failure - factory Failure.translation({ - required T message, - required StackTrace stackTrace, - }) => Failure(message: message, stackTrace: stackTrace); - // - // Unexpected failure - factory Failure.unexpected({ - required T message, - required StackTrace stackTrace, - }) => Failure(message: message, stackTrace: stackTrace); -} +} \ No newline at end of file diff --git a/test/unit/core/failure_test.dart b/test/unit/core/failure_test.dart new file mode 100644 index 0000000..9962bea --- /dev/null +++ b/test/unit/core/failure_test.dart @@ -0,0 +1,26 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:hmi_core/hmi_core.dart'; + +void main() { + group('Failure', () { + test('toString()', () { + final desiredMessage = List.generate( + 3, + (index) => 'Failure: message$index', + ) + .join('\n\tsubfailure: '); + final failure = const Failure( + message: '0', + failure: Failure( + message: '1', + failure: Failure( + message: '2', + ), + ), + ); + print(failure.toString()); + expect(failure.toString(), desiredMessage); + }); + + }); +} \ No newline at end of file