diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a52bfc7..d2cad43 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,18 +7,17 @@ name: CI on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] env: - DART_VERSION: 3.5.0 + DART_VERSION: 3.10.4 jobs: ci: runs-on: ubuntu-latest steps: - - name: Checkout uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3.1.0 @@ -42,7 +41,7 @@ jobs: - uses: codecov/codecov-action@40a12dcee2df644d47232dde008099a3e9e4f865 #v3.1.2 with: files: coverage/lcov.info - + pana: runs-on: ubuntu-latest steps: diff --git a/.gitignore b/.gitignore index d3f50d7..dc7cc48 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,10 @@ build/ !**/ios/**/default.mode2v3 !**/ios/**/default.pbxuser !**/ios/**/default.perspectivev3 + +# FVM Version Cache +.fvm/ +# FVM Configuration +.fvmrc +# FVM Flutter SDK Configuration +.vscode/settings.json diff --git a/CHANGELOG.md b/CHANGELOG.md index e4f7964..d98e2cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,50 +1,64 @@ +## 0.6.0 + +## Unreleased + +- Removed `freezed` and `freezed_annotation` dependencies. +- Updated `NetworkRequestBody` and `SturdyHttpEvent` to be a sealed classes. +- Changed behavior of when `DecodingError`s are emitted. + ## 0.5.1 ## What's Changed -* fix: loosen collection constraint by @btrautmann in https://github.com/Betterment/sturdy_http/pull/16 +- fix: loosen collection constraint by @btrautmann in https://github.com/Betterment/sturdy_http/pull/16 **Full Changelog**: https://github.com/Betterment/sturdy_http/compare/v0.5.0...v0.5.1 ## 0.5.0 ## What's Changed -* refactor: make network response a sealed class by @btrautmann in https://github.com/Betterment/sturdy_http/pull/14 +- refactor: make network response a sealed class by @btrautmann in https://github.com/Betterment/sturdy_http/pull/14 **Full Changelog**: https://github.com/Betterment/sturdy_http/compare/v0.4.0...v0.5.0 ## 0.4.0 ## What's Changed -* feat: Add support for `426: Upgrade Required` by @willlockwood in https://github.com/Betterment/sturdy_http/pull/12 + +- feat: Add support for `426: Upgrade Required` by @willlockwood in https://github.com/Betterment/sturdy_http/pull/12 ## New Contributors -* @willlockwood made their first contribution in https://github.com/Betterment/sturdy_http/pull/12 + +- @willlockwood made their first contribution in https://github.com/Betterment/sturdy_http/pull/12 **Full Changelog**: https://github.com/Betterment/sturdy_http/compare/v0.3.1...v0.4.0 ## 0.3.1 ## What's Changed -* fix: export retry_behavior by @btrautmann in https://github.com/Betterment/sturdy_http/pull/10 + +- fix: export retry_behavior by @btrautmann in https://github.com/Betterment/sturdy_http/pull/10 **Full Changelog**: https://github.com/Betterment/sturdy_http/compare/v0.3.0...v0.3.1 ## 0.3.0 ## What's Changed -* feat: support retrying failed requests by @btrautmann in https://github.com/Betterment/sturdy_http/pull/8 + +- feat: support retrying failed requests by @btrautmann in https://github.com/Betterment/sturdy_http/pull/8 **Full Changelog**: https://github.com/Betterment/sturdy_http/compare/v0.2.0...v0.3.0 ## 0.2.0 ## What's Changed -* chore: update outdated dependencies by @ClaireDavis in https://github.com/Betterment/sturdy_http/pull/6 + +- chore: update outdated dependencies by @ClaireDavis in https://github.com/Betterment/sturdy_http/pull/6 ## New Contributors -* @ClaireDavis made their first contribution in https://github.com/Betterment/sturdy_http/pull/6 + +- @ClaireDavis made their first contribution in https://github.com/Betterment/sturdy_http/pull/6 **Full Changelog**: https://github.com/Betterment/sturdy_http/compare/v0.1.0...v0.2.0 diff --git a/README.md b/README.md index 20db63f..beb8c96 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,12 @@ Then, execute requests: Future> fetch({required int id}) async { return _client.execute( GetRequest('/v6/data/${id}'), - onResponse: (r) => r.maybeWhen( - ok: (json) => Result.success(MyData.fromJson), - orElse: () => Result.failure(r), - ), + onResponse: (r) { + return switch (r) { + OkResponse(:final response) => Result.success(MyData.fromJson(response)), + _ => Result.failure(r), + }; + }, ); } ``` @@ -69,9 +71,6 @@ extension SturdyHttpX on SturdyHttp { } ``` -> **Warning** -> We're considering open-sourcing our `Result` type and integrating it into `SturdyHttp`. If we did, we'd likely change `execute`'s return type to be a `Result`, and offer `executeUnsafe` as the non-`Result` (i.e `Exception` throwing) alternative. This would be a breaking change. - ## Contributing If you run into a bug or limitation when using `SturdyHttp`, we'd love your help in resolving it. First, it would be awesome if you could [open an issue](https://github.com/Betterment/sturdy_http/issues/new/choose) to discuss. If we feel like we should move forward with a change and you're willing to contribute, create a fork of `SturdyHttp` and open a PR against the main repo. diff --git a/analysis_options.yaml b/analysis_options.yaml index 79b71e6..076e16e 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,5 +1,8 @@ include: package:lints/recommended.yaml +formatter: + page_width: 80 + linter: rules: - package_api_docs @@ -15,5 +18,4 @@ analyzer: missing_return: error missing_required_param: error exclude: - - "build/**" - - "**/*.g.dart" + - 'build/**' diff --git a/build.yaml b/build.yaml deleted file mode 100644 index 1c172e1..0000000 --- a/build.yaml +++ /dev/null @@ -1,21 +0,0 @@ -targets: - $default: - builders: - json_serializable: - options: - # Options configure how source code is generated for every - # `@JsonSerializable`-annotated class in the package. - any_map: false - checked: true - create_factory: true - create_to_json: true - disallow_unrecognized_keys: false - explicit_to_json: true - field_rename: snake - ignore_unannotated: false - include_if_null: true - generate_for: - - "**/*.dart" - freezed: - generate_for: - - "**/*.dart" diff --git a/codecov.yml b/codecov.yml deleted file mode 100644 index 20e2c1f..0000000 --- a/codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -ignore: - - "**/*.freezed.dart" - - "**/*.g.dart" \ No newline at end of file diff --git a/example/main.dart b/example/main.dart index b1b55db..b95faea 100644 --- a/example/main.dart +++ b/example/main.dart @@ -4,16 +4,8 @@ import 'package:sturdy_http/sturdy_http.dart'; void main(List args) async { // Set up some fake HTTP responses using Charlatan final charlatan = Charlatan() - ..whenGet( - '/foo', - (request) => CharlatanHttpResponse( - body: 'Hello World!', - ), - ) - ..whenPost( - '/foo', - (request) => CharlatanHttpResponse(statusCode: 204), - ); + ..whenGet('/foo', (request) => CharlatanHttpResponse(body: 'Hello World!')) + ..whenPost('/foo', (request) => CharlatanHttpResponse(statusCode: 204)); // Create your client final client = SturdyHttp( @@ -39,7 +31,7 @@ void main(List args) async { // 'mutative request success' <-- From ExampleEventListener // 'success!' await client.execute( - PostRequest('/foo', data: NetworkRequestBody.empty()), + PostRequest('/foo', data: EmptyRequestBody()), onResponse: (r) { return switch (r) { OkNoContent() => print('success!'), @@ -51,11 +43,14 @@ void main(List args) async { class ExampleEventListener implements SturdyHttpEventListener { @override - Future onEvent(SturdyHttpEvent event) { - return event.when( - decodingError: (_, __, ___) async => print('decoding error'), - authFailure: (_) async => print('auth failure'), - mutativeRequestSuccess: (_) async => print('mutative request success'), - ); + Future onEvent(SturdyHttpEvent event) async { + switch (event) { + case DecodingError(): + print('decoding error'); + case AuthFailure(): + print('auth failure'); + case MutativeRequestSuccess(): + print('mutative request success'); + } } } diff --git a/lib/src/_dio_error.dart b/lib/src/_dio_error.dart index c9a2a1c..9241342 100644 --- a/lib/src/_dio_error.dart +++ b/lib/src/_dio_error.dart @@ -17,7 +17,8 @@ extension DioExceptionX on DioException { DioExceptionType.sendTimeout, DioExceptionType.unknown, ]; - final isKnownExceptionType = error is HandshakeException || + final isKnownExceptionType = + error is HandshakeException || error is SocketException || error is HttpException; return knownBadConnectionTypes.contains(type) || isKnownExceptionType; diff --git a/lib/src/deserializer.dart b/lib/src/deserializer.dart index c473468..b4331d1 100644 --- a/lib/src/deserializer.dart +++ b/lib/src/deserializer.dart @@ -99,9 +99,7 @@ class BackgroundDeserializer implements Deserializer { // Use BroadcastStream to facilitate multiple requests for // deserialization over the same SendPort. _results ??= _mainReceivePort.asBroadcastStream(); - _workerIsolate ??= await _spawnIsolate( - mainReceivePort: _mainReceivePort, - ); + _workerIsolate ??= await _spawnIsolate(mainReceivePort: _mainReceivePort); _workerSendPort ??= await _results!.first as SendPort; } } @@ -162,10 +160,8 @@ class _IsolateRequest { final SendPort resultPort; final dynamic Function() decoder; - _IsolateRequest({ - required this.resultPort, - required this.decoder, - }) : id = const Uuid().v4(); + _IsolateRequest({required this.resultPort, required this.decoder}) + : id = const Uuid().v4(); } /// The result of an attempt to deserialize a response. @@ -184,16 +180,8 @@ class _IsolateResult { }); factory _IsolateResult.ok(dynamic value, String requestId) => - _IsolateResult._( - response: value, - error: null, - requestId: requestId, - ); + _IsolateResult._(response: value, error: null, requestId: requestId); factory _IsolateResult.error(Exception error, String requestId) => - _IsolateResult._( - response: null, - error: error, - requestId: requestId, - ); + _IsolateResult._(response: null, error: error, requestId: requestId); } diff --git a/lib/src/network_request.dart b/lib/src/network_request.dart index 96757c5..877ccc2 100644 --- a/lib/src/network_request.dart +++ b/lib/src/network_request.dart @@ -1,9 +1,6 @@ import 'package:dio/dio.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:sturdy_http/sturdy_http.dart'; -part 'network_request.freezed.dart'; - /// {@template network_request_type} /// /// A type representing the available HTTP request methods. @@ -43,7 +40,7 @@ abstract class NetworkRequest { final NetworkRequestBody data; /// Whether this request should be considered as mutative. If false, - /// [SturdyHttp] will not emit an [SturdyHttpEvent.mutativeRequestSuccess] + /// [SturdyHttp] will not emit an [MutativeRequestSuccess] /// event. final bool shouldTriggerDataMutation; @@ -74,7 +71,7 @@ class GetRequest extends NetworkRequest { /// {@macro get_request} const GetRequest( String path, { - super.data = const NetworkRequestBody.empty(), + super.data = const EmptyRequestBody(), Map? queryParameters, super.options, super.cancelToken, @@ -82,11 +79,11 @@ class GetRequest extends NetworkRequest { super.onSendProgress, super.retryBehavior, }) : super( - type: NetworkRequestType.Get, - path: path, - shouldTriggerDataMutation: false, - queryParams: queryParameters, - ); + type: NetworkRequestType.Get, + path: path, + shouldTriggerDataMutation: false, + queryParams: queryParameters, + ); } /// {@template post_request} @@ -105,10 +102,10 @@ class PostRequest extends NetworkRequest { super.onSendProgress, super.retryBehavior, }) : super( - type: NetworkRequestType.Post, - path: path, - queryParams: queryParameters, - ); + type: NetworkRequestType.Post, + path: path, + queryParams: queryParameters, + ); } /// {@template put_request} @@ -127,10 +124,10 @@ class PutRequest extends NetworkRequest { super.onSendProgress, super.retryBehavior, }) : super( - type: NetworkRequestType.Put, - path: path, - queryParams: queryParameters, - ); + type: NetworkRequestType.Put, + path: path, + queryParams: queryParameters, + ); } /// {@template delete_request} @@ -140,7 +137,7 @@ class DeleteRequest extends NetworkRequest { /// {@macro delete_request} const DeleteRequest( String path, { - super.data = const NetworkRequestBody.empty(), + super.data = const EmptyRequestBody(), Map? queryParameters, super.shouldTriggerDataMutation = true, super.options, @@ -149,10 +146,10 @@ class DeleteRequest extends NetworkRequest { super.onSendProgress, super.retryBehavior, }) : super( - type: NetworkRequestType.Delete, - path: path, - queryParams: queryParameters, - ); + type: NetworkRequestType.Delete, + path: path, + queryParams: queryParameters, + ); } /// {@template raw_request} @@ -165,7 +162,7 @@ class RawRequest extends NetworkRequest { const RawRequest( String path, { required super.type, - super.data = const NetworkRequestBody.empty(), + super.data = const EmptyRequestBody(), Map? queryParameters, super.shouldTriggerDataMutation = true, super.options, @@ -173,10 +170,7 @@ class RawRequest extends NetworkRequest { super.onReceiveProgress, super.onSendProgress, super.retryBehavior, - }) : super( - path: path, - queryParams: queryParameters, - ); + }) : super(path: path, queryParams: queryParameters); } /// The body of a [NetworkRequest]. Note that this type is aimed at providing @@ -184,20 +178,43 @@ class RawRequest extends NetworkRequest { /// with regards to the content-type header. If you want [SturdyHttp] to infer /// the content-type header, configure this via the `inferContentType` parameter /// when constructing the instance. -@Freezed(copyWith: false) -class NetworkRequestBody with _$NetworkRequestBody { - /// An empty body. Results in `null` being passed to `data` of the request. - const factory NetworkRequestBody.empty() = _Empty; - - /// A JSON body. Passed directly to `data` of the request. If `inferContentType` - /// has been provided as `true` to the [SturdyHttp] instance, will result in - /// an `application-json` `content-type`. - const factory NetworkRequestBody.json(Json data) = _Json; - - /// A raw body. Allows for nullable untyped data that is passed directly - /// to `data` of the request, useful for instances where the data type - /// is not known until runtime. If `inferContentType` has been provided as - /// `true` to the [SturdyHttp] instance *and* the [data] can be used to infer - /// the `content-type` header, it will be inferred. - const factory NetworkRequestBody.raw(Object? data) = _Raw; +sealed class NetworkRequestBody { + /// {@macro network_request_body} + const NetworkRequestBody(); +} + +/// {@template empty_request_body} +/// An empty body. Results in `null` being passed to `data` of the request. +/// {@endtemplate} +final class EmptyRequestBody extends NetworkRequestBody { + /// {@macro empty_request_body} + const EmptyRequestBody(); +} + +/// {@template json_request_body} +/// A JSON body. Passed directly to `data` of the request. If `inferContentType` +/// has been provided as `true` to the [SturdyHttp] instance, will result in +/// an `application-json` `content-type`. +/// {@endtemplate} +final class JsonRequestBody extends NetworkRequestBody { + /// The JSON data to be sent as the body of the request + final Json data; + + /// {@macro json_request_body} + const JsonRequestBody(this.data); +} + +/// {@template raw_request_body} +/// A raw body. Allows for nullable untyped data that is passed directly +/// to `data` of the request, useful for instances where the data type +/// is not known until runtime. If `inferContentType` has been provided as +/// `true` to the [SturdyHttp] instance *and* the [data] can be used to infer +/// the `content-type` header, it will be inferred. +/// {@endtemplate} +final class RawRequestBody extends NetworkRequestBody { + /// The raw data to be sent as the body of the request + final Object? data; + + /// {@macro raw_request_body} + const RawRequestBody(this.data); } diff --git a/lib/src/network_request.freezed.dart b/lib/src/network_request.freezed.dart deleted file mode 100644 index 0e99a7f..0000000 --- a/lib/src/network_request.freezed.dart +++ /dev/null @@ -1,360 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'network_request.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -/// @nodoc -mixin _$NetworkRequestBody { - @optionalTypeArgs - TResult when({ - required TResult Function() empty, - required TResult Function(Map data) json, - required TResult Function(Object? data) raw, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? empty, - TResult? Function(Map data)? json, - TResult? Function(Object? data)? raw, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? empty, - TResult Function(Map data)? json, - TResult Function(Object? data)? raw, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(_Empty value) empty, - required TResult Function(_Json value) json, - required TResult Function(_Raw value) raw, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Empty value)? empty, - TResult? Function(_Json value)? json, - TResult? Function(_Raw value)? raw, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Empty value)? empty, - TResult Function(_Json value)? json, - TResult Function(_Raw value)? raw, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc - -class _$EmptyImpl implements _Empty { - const _$EmptyImpl(); - - @override - String toString() { - return 'NetworkRequestBody.empty()'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && other is _$EmptyImpl); - } - - @override - int get hashCode => runtimeType.hashCode; - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() empty, - required TResult Function(Map data) json, - required TResult Function(Object? data) raw, - }) { - return empty(); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? empty, - TResult? Function(Map data)? json, - TResult? Function(Object? data)? raw, - }) { - return empty?.call(); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? empty, - TResult Function(Map data)? json, - TResult Function(Object? data)? raw, - required TResult orElse(), - }) { - if (empty != null) { - return empty(); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_Empty value) empty, - required TResult Function(_Json value) json, - required TResult Function(_Raw value) raw, - }) { - return empty(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Empty value)? empty, - TResult? Function(_Json value)? json, - TResult? Function(_Raw value)? raw, - }) { - return empty?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Empty value)? empty, - TResult Function(_Json value)? json, - TResult Function(_Raw value)? raw, - required TResult orElse(), - }) { - if (empty != null) { - return empty(this); - } - return orElse(); - } -} - -abstract class _Empty implements NetworkRequestBody { - const factory _Empty() = _$EmptyImpl; -} - -/// @nodoc - -class _$JsonImpl implements _Json { - const _$JsonImpl(final Map data) : _data = data; - - final Map _data; - @override - Map get data { - if (_data is EqualUnmodifiableMapView) return _data; - // ignore: implicit_dynamic_type - return EqualUnmodifiableMapView(_data); - } - - @override - String toString() { - return 'NetworkRequestBody.json(data: $data)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$JsonImpl && - const DeepCollectionEquality().equals(other._data, _data)); - } - - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(_data)); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() empty, - required TResult Function(Map data) json, - required TResult Function(Object? data) raw, - }) { - return json(data); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? empty, - TResult? Function(Map data)? json, - TResult? Function(Object? data)? raw, - }) { - return json?.call(data); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? empty, - TResult Function(Map data)? json, - TResult Function(Object? data)? raw, - required TResult orElse(), - }) { - if (json != null) { - return json(data); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_Empty value) empty, - required TResult Function(_Json value) json, - required TResult Function(_Raw value) raw, - }) { - return json(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Empty value)? empty, - TResult? Function(_Json value)? json, - TResult? Function(_Raw value)? raw, - }) { - return json?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Empty value)? empty, - TResult Function(_Json value)? json, - TResult Function(_Raw value)? raw, - required TResult orElse(), - }) { - if (json != null) { - return json(this); - } - return orElse(); - } -} - -abstract class _Json implements NetworkRequestBody { - const factory _Json(final Map data) = _$JsonImpl; - - Map get data; -} - -/// @nodoc - -class _$RawImpl implements _Raw { - const _$RawImpl(this.data); - - @override - final Object? data; - - @override - String toString() { - return 'NetworkRequestBody.raw(data: $data)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$RawImpl && - const DeepCollectionEquality().equals(other.data, data)); - } - - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(data)); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function() empty, - required TResult Function(Map data) json, - required TResult Function(Object? data) raw, - }) { - return raw(data); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function()? empty, - TResult? Function(Map data)? json, - TResult? Function(Object? data)? raw, - }) { - return raw?.call(data); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function()? empty, - TResult Function(Map data)? json, - TResult Function(Object? data)? raw, - required TResult orElse(), - }) { - if (raw != null) { - return raw(data); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_Empty value) empty, - required TResult Function(_Json value) json, - required TResult Function(_Raw value) raw, - }) { - return raw(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Empty value)? empty, - TResult? Function(_Json value)? json, - TResult? Function(_Raw value)? raw, - }) { - return raw?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Empty value)? empty, - TResult Function(_Json value)? json, - TResult Function(_Raw value)? raw, - required TResult orElse(), - }) { - if (raw != null) { - return raw(this); - } - return orElse(); - } -} - -abstract class _Raw implements NetworkRequestBody { - const factory _Raw(final Object? data) = _$RawImpl; - - Object? get data; -} diff --git a/lib/src/retry_behavior.dart b/lib/src/retry_behavior.dart index b7f483b..c57e138 100644 --- a/lib/src/retry_behavior.dart +++ b/lib/src/retry_behavior.dart @@ -66,9 +66,9 @@ extension RetryBehaviorX on RetryBehavior { bool shouldRetry(Response? response, int retryCount) { return switch (this) { Retry(:final maxRetries, :final retryClause) => () { - if (retryCount >= maxRetries) return false; - return retryClause?.call(response) ?? defaultRetryClause(response); - }(), + if (retryCount >= maxRetries) return false; + return retryClause?.call(response) ?? defaultRetryClause(response); + }(), _ => false, }; } diff --git a/lib/src/sturdy_http.dart b/lib/src/sturdy_http.dart index 0c62f7e..6588fc8 100644 --- a/lib/src/sturdy_http.dart +++ b/lib/src/sturdy_http.dart @@ -3,7 +3,6 @@ import 'dart:isolate'; import 'package:collection/collection.dart'; import 'package:dio/dio.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:sturdy_http/sturdy_http.dart'; import 'package:uuid/uuid.dart'; @@ -51,18 +50,18 @@ class SturdyHttp { bool inferContentType = true, RetryBehavior retryBehavior = const NeverRetry(), }) : this._( - dio: _configureDio( - baseUrl: baseUrl, - deserializer: deserializer, - interceptors: interceptors, - customAdapter: customAdapter, - proxy: proxy, - inferContentType: inferContentType, - ), - deserializer: deserializer, - eventListener: eventListener, - retryBehavior: retryBehavior, - ); + dio: _configureDio( + baseUrl: baseUrl, + deserializer: deserializer, + interceptors: interceptors, + customAdapter: customAdapter, + proxy: proxy, + inferContentType: inferContentType, + ), + deserializer: deserializer, + eventListener: eventListener, + retryBehavior: retryBehavior, + ); /// {@macro http_client} SturdyHttp._({ @@ -70,10 +69,10 @@ class SturdyHttp { required Deserializer deserializer, required SturdyHttpEventListener? eventListener, required RetryBehavior retryBehavior, - }) : _dio = dio, - _deserializer = deserializer, - _eventListener = eventListener, - _retryBehavior = retryBehavior; + }) : _dio = dio, + _deserializer = deserializer, + _eventListener = eventListener, + _retryBehavior = retryBehavior; /// {@macro http_client} SturdyHttp withBaseUrl(String baseUrl) { @@ -112,15 +111,13 @@ class SturdyHttp { onResponse: onResponse, ); } on Exception catch (e) { - if (e is CheckedFromJsonException) { - await _onEvent( - SturdyHttpEvent.decodingError( - responsePayload.dioResponse!.requestOptions, - e, - e.innerStack, - ), - ); - } + await _onEvent( + DecodingError( + request: responsePayload.dioResponse!.requestOptions, + exception: e, + stackTrace: StackTrace.current, + ), + ); rethrow; } } @@ -140,11 +137,11 @@ class SturdyHttp { // an empty String, which is not a subtype of Json. dioResponse = await _dio.request( request.path, - data: request.data.when( - empty: () => null, - json: (json) => json, - raw: (data) => data, - ), + data: switch (request.data) { + EmptyRequestBody() => null, + JsonRequestBody(:final data) => data, + RawRequestBody(:final data) => data, + }, queryParameters: request.queryParams, options: request.options != null ? request.options!.copyWith(method: request.type.name) @@ -179,7 +176,7 @@ class SturdyHttp { } on DioException catch (error) { switch (error.response?.statusCode) { case 401: - await _onEvent(SturdyHttpEvent.authFailure(error.requestOptions)); + await _onEvent(AuthFailure(request: error.requestOptions)); resolvedResponse = Unauthorized(error: error); break; case 403: @@ -237,7 +234,7 @@ class SturdyHttp { if (response.$2.isSuccess && request.shouldTriggerDataMutation) { await _onEvent( - SturdyHttpEvent.mutativeRequestSuccess(response.$1!.requestOptions), + MutativeRequestSuccess(request: response.$1!.requestOptions), ); } diff --git a/lib/src/sturdy_http_event_listener.dart b/lib/src/sturdy_http_event_listener.dart index 2e996b7..6257231 100644 --- a/lib/src/sturdy_http_event_listener.dart +++ b/lib/src/sturdy_http_event_listener.dart @@ -1,14 +1,10 @@ import 'package:dio/dio.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; - -part 'sturdy_http_event_listener.freezed.dart'; +import 'package:sturdy_http/src/network_request.dart'; /// {@template http_client_event_listener} -/// /// A listener that can optionally be supplied when constructing /// an [SturdyHttp] to be notified when various events occur /// while processing [NetworkRequest]s. -/// /// {@endtemplate} abstract class SturdyHttpEventListener { /// {@macro http_client_event_listener} @@ -19,23 +15,46 @@ abstract class SturdyHttpEventListener { } /// Represents an event that occurs during a request lifecycle. -@freezed -class SturdyHttpEvent with _$SturdyHttpEvent { - /// Indicates that there was an Exception thrown when attempting to decode - /// the server response. - const factory SturdyHttpEvent.decodingError( - RequestOptions request, - Exception exception, - StackTrace? stackTrace, - ) = _JsonDecodingError; - - /// Indicates that a network request returned a response with status code 401. - const factory SturdyHttpEvent.authFailure(RequestOptions request) = - _AuthFailure; - - /// Indicates that a "mutative" request succeeded and the data on the client - /// likely does not match the data on the server. - /// See [NetworkRequest.shouldTriggerDataMutation]. - const factory SturdyHttpEvent.mutativeRequestSuccess(RequestOptions request) = - _OnMutativeRequestSuccess; +sealed class SturdyHttpEvent { + /// The [RequestOptions] associated with the request that triggered this event. + final RequestOptions request; + + SturdyHttpEvent({required this.request}); +} + +/// {@template decoding_error} +/// Indicates that there was an Exception thrown when attempting to decode +/// the server response. +/// {@endtemplate} +final class DecodingError extends SturdyHttpEvent { + /// The exception that was thrown during decoding + final Exception exception; + + /// The stack trace at the point the exception was thrown + final StackTrace? stackTrace; + + /// {@macro decoding_error} + DecodingError({ + required super.request, + required this.exception, + required this.stackTrace, + }); +} + +/// {@template auth_failure} +/// Indicates that a network request returned a response with status code 401. +/// {@endtemplate} +final class AuthFailure extends SturdyHttpEvent { + /// {@macro auth_failure} + AuthFailure({required super.request}); +} + +/// {@template mutative_request_success} +/// Indicates that a "mutative" request succeeded and the data on the client +/// likely does not match the data on the server. +/// See [NetworkRequest.shouldTriggerDataMutation]. +/// {@endtemplate} +final class MutativeRequestSuccess extends SturdyHttpEvent { + /// {@macro mutative_request_success} + MutativeRequestSuccess({required super.request}); } diff --git a/lib/src/sturdy_http_event_listener.freezed.dart b/lib/src/sturdy_http_event_listener.freezed.dart deleted file mode 100644 index dab4ba9..0000000 --- a/lib/src/sturdy_http_event_listener.freezed.dart +++ /dev/null @@ -1,612 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'sturdy_http_event_listener.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -/// @nodoc -mixin _$SturdyHttpEvent { - RequestOptions get request => throw _privateConstructorUsedError; - @optionalTypeArgs - TResult when({ - required TResult Function( - RequestOptions request, Exception exception, StackTrace? stackTrace) - decodingError, - required TResult Function(RequestOptions request) authFailure, - required TResult Function(RequestOptions request) mutativeRequestSuccess, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(RequestOptions request, Exception exception, - StackTrace? stackTrace)? - decodingError, - TResult? Function(RequestOptions request)? authFailure, - TResult? Function(RequestOptions request)? mutativeRequestSuccess, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(RequestOptions request, Exception exception, - StackTrace? stackTrace)? - decodingError, - TResult Function(RequestOptions request)? authFailure, - TResult Function(RequestOptions request)? mutativeRequestSuccess, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(_JsonDecodingError value) decodingError, - required TResult Function(_AuthFailure value) authFailure, - required TResult Function(_OnMutativeRequestSuccess value) - mutativeRequestSuccess, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_JsonDecodingError value)? decodingError, - TResult? Function(_AuthFailure value)? authFailure, - TResult? Function(_OnMutativeRequestSuccess value)? mutativeRequestSuccess, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_JsonDecodingError value)? decodingError, - TResult Function(_AuthFailure value)? authFailure, - TResult Function(_OnMutativeRequestSuccess value)? mutativeRequestSuccess, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $SturdyHttpEventCopyWith get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $SturdyHttpEventCopyWith<$Res> { - factory $SturdyHttpEventCopyWith( - SturdyHttpEvent value, $Res Function(SturdyHttpEvent) then) = - _$SturdyHttpEventCopyWithImpl<$Res, SturdyHttpEvent>; - @useResult - $Res call({RequestOptions request}); -} - -/// @nodoc -class _$SturdyHttpEventCopyWithImpl<$Res, $Val extends SturdyHttpEvent> - implements $SturdyHttpEventCopyWith<$Res> { - _$SturdyHttpEventCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? request = null, - }) { - return _then(_value.copyWith( - request: null == request - ? _value.request - : request // ignore: cast_nullable_to_non_nullable - as RequestOptions, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$JsonDecodingErrorImplCopyWith<$Res> - implements $SturdyHttpEventCopyWith<$Res> { - factory _$$JsonDecodingErrorImplCopyWith(_$JsonDecodingErrorImpl value, - $Res Function(_$JsonDecodingErrorImpl) then) = - __$$JsonDecodingErrorImplCopyWithImpl<$Res>; - @override - @useResult - $Res call( - {RequestOptions request, Exception exception, StackTrace? stackTrace}); -} - -/// @nodoc -class __$$JsonDecodingErrorImplCopyWithImpl<$Res> - extends _$SturdyHttpEventCopyWithImpl<$Res, _$JsonDecodingErrorImpl> - implements _$$JsonDecodingErrorImplCopyWith<$Res> { - __$$JsonDecodingErrorImplCopyWithImpl(_$JsonDecodingErrorImpl _value, - $Res Function(_$JsonDecodingErrorImpl) _then) - : super(_value, _then); - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? request = null, - Object? exception = null, - Object? stackTrace = freezed, - }) { - return _then(_$JsonDecodingErrorImpl( - null == request - ? _value.request - : request // ignore: cast_nullable_to_non_nullable - as RequestOptions, - null == exception - ? _value.exception - : exception // ignore: cast_nullable_to_non_nullable - as Exception, - freezed == stackTrace - ? _value.stackTrace - : stackTrace // ignore: cast_nullable_to_non_nullable - as StackTrace?, - )); - } -} - -/// @nodoc - -class _$JsonDecodingErrorImpl implements _JsonDecodingError { - const _$JsonDecodingErrorImpl(this.request, this.exception, this.stackTrace); - - @override - final RequestOptions request; - @override - final Exception exception; - @override - final StackTrace? stackTrace; - - @override - String toString() { - return 'SturdyHttpEvent.decodingError(request: $request, exception: $exception, stackTrace: $stackTrace)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$JsonDecodingErrorImpl && - (identical(other.request, request) || other.request == request) && - (identical(other.exception, exception) || - other.exception == exception) && - (identical(other.stackTrace, stackTrace) || - other.stackTrace == stackTrace)); - } - - @override - int get hashCode => Object.hash(runtimeType, request, exception, stackTrace); - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$JsonDecodingErrorImplCopyWith<_$JsonDecodingErrorImpl> get copyWith => - __$$JsonDecodingErrorImplCopyWithImpl<_$JsonDecodingErrorImpl>( - this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - RequestOptions request, Exception exception, StackTrace? stackTrace) - decodingError, - required TResult Function(RequestOptions request) authFailure, - required TResult Function(RequestOptions request) mutativeRequestSuccess, - }) { - return decodingError(request, exception, stackTrace); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(RequestOptions request, Exception exception, - StackTrace? stackTrace)? - decodingError, - TResult? Function(RequestOptions request)? authFailure, - TResult? Function(RequestOptions request)? mutativeRequestSuccess, - }) { - return decodingError?.call(request, exception, stackTrace); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(RequestOptions request, Exception exception, - StackTrace? stackTrace)? - decodingError, - TResult Function(RequestOptions request)? authFailure, - TResult Function(RequestOptions request)? mutativeRequestSuccess, - required TResult orElse(), - }) { - if (decodingError != null) { - return decodingError(request, exception, stackTrace); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_JsonDecodingError value) decodingError, - required TResult Function(_AuthFailure value) authFailure, - required TResult Function(_OnMutativeRequestSuccess value) - mutativeRequestSuccess, - }) { - return decodingError(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_JsonDecodingError value)? decodingError, - TResult? Function(_AuthFailure value)? authFailure, - TResult? Function(_OnMutativeRequestSuccess value)? mutativeRequestSuccess, - }) { - return decodingError?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_JsonDecodingError value)? decodingError, - TResult Function(_AuthFailure value)? authFailure, - TResult Function(_OnMutativeRequestSuccess value)? mutativeRequestSuccess, - required TResult orElse(), - }) { - if (decodingError != null) { - return decodingError(this); - } - return orElse(); - } -} - -abstract class _JsonDecodingError implements SturdyHttpEvent { - const factory _JsonDecodingError( - final RequestOptions request, - final Exception exception, - final StackTrace? stackTrace) = _$JsonDecodingErrorImpl; - - @override - RequestOptions get request; - Exception get exception; - StackTrace? get stackTrace; - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$JsonDecodingErrorImplCopyWith<_$JsonDecodingErrorImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$AuthFailureImplCopyWith<$Res> - implements $SturdyHttpEventCopyWith<$Res> { - factory _$$AuthFailureImplCopyWith( - _$AuthFailureImpl value, $Res Function(_$AuthFailureImpl) then) = - __$$AuthFailureImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({RequestOptions request}); -} - -/// @nodoc -class __$$AuthFailureImplCopyWithImpl<$Res> - extends _$SturdyHttpEventCopyWithImpl<$Res, _$AuthFailureImpl> - implements _$$AuthFailureImplCopyWith<$Res> { - __$$AuthFailureImplCopyWithImpl( - _$AuthFailureImpl _value, $Res Function(_$AuthFailureImpl) _then) - : super(_value, _then); - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? request = null, - }) { - return _then(_$AuthFailureImpl( - null == request - ? _value.request - : request // ignore: cast_nullable_to_non_nullable - as RequestOptions, - )); - } -} - -/// @nodoc - -class _$AuthFailureImpl implements _AuthFailure { - const _$AuthFailureImpl(this.request); - - @override - final RequestOptions request; - - @override - String toString() { - return 'SturdyHttpEvent.authFailure(request: $request)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$AuthFailureImpl && - (identical(other.request, request) || other.request == request)); - } - - @override - int get hashCode => Object.hash(runtimeType, request); - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$AuthFailureImplCopyWith<_$AuthFailureImpl> get copyWith => - __$$AuthFailureImplCopyWithImpl<_$AuthFailureImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - RequestOptions request, Exception exception, StackTrace? stackTrace) - decodingError, - required TResult Function(RequestOptions request) authFailure, - required TResult Function(RequestOptions request) mutativeRequestSuccess, - }) { - return authFailure(request); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(RequestOptions request, Exception exception, - StackTrace? stackTrace)? - decodingError, - TResult? Function(RequestOptions request)? authFailure, - TResult? Function(RequestOptions request)? mutativeRequestSuccess, - }) { - return authFailure?.call(request); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(RequestOptions request, Exception exception, - StackTrace? stackTrace)? - decodingError, - TResult Function(RequestOptions request)? authFailure, - TResult Function(RequestOptions request)? mutativeRequestSuccess, - required TResult orElse(), - }) { - if (authFailure != null) { - return authFailure(request); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_JsonDecodingError value) decodingError, - required TResult Function(_AuthFailure value) authFailure, - required TResult Function(_OnMutativeRequestSuccess value) - mutativeRequestSuccess, - }) { - return authFailure(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_JsonDecodingError value)? decodingError, - TResult? Function(_AuthFailure value)? authFailure, - TResult? Function(_OnMutativeRequestSuccess value)? mutativeRequestSuccess, - }) { - return authFailure?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_JsonDecodingError value)? decodingError, - TResult Function(_AuthFailure value)? authFailure, - TResult Function(_OnMutativeRequestSuccess value)? mutativeRequestSuccess, - required TResult orElse(), - }) { - if (authFailure != null) { - return authFailure(this); - } - return orElse(); - } -} - -abstract class _AuthFailure implements SturdyHttpEvent { - const factory _AuthFailure(final RequestOptions request) = _$AuthFailureImpl; - - @override - RequestOptions get request; - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$AuthFailureImplCopyWith<_$AuthFailureImpl> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$OnMutativeRequestSuccessImplCopyWith<$Res> - implements $SturdyHttpEventCopyWith<$Res> { - factory _$$OnMutativeRequestSuccessImplCopyWith( - _$OnMutativeRequestSuccessImpl value, - $Res Function(_$OnMutativeRequestSuccessImpl) then) = - __$$OnMutativeRequestSuccessImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({RequestOptions request}); -} - -/// @nodoc -class __$$OnMutativeRequestSuccessImplCopyWithImpl<$Res> - extends _$SturdyHttpEventCopyWithImpl<$Res, _$OnMutativeRequestSuccessImpl> - implements _$$OnMutativeRequestSuccessImplCopyWith<$Res> { - __$$OnMutativeRequestSuccessImplCopyWithImpl( - _$OnMutativeRequestSuccessImpl _value, - $Res Function(_$OnMutativeRequestSuccessImpl) _then) - : super(_value, _then); - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? request = null, - }) { - return _then(_$OnMutativeRequestSuccessImpl( - null == request - ? _value.request - : request // ignore: cast_nullable_to_non_nullable - as RequestOptions, - )); - } -} - -/// @nodoc - -class _$OnMutativeRequestSuccessImpl implements _OnMutativeRequestSuccess { - const _$OnMutativeRequestSuccessImpl(this.request); - - @override - final RequestOptions request; - - @override - String toString() { - return 'SturdyHttpEvent.mutativeRequestSuccess(request: $request)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$OnMutativeRequestSuccessImpl && - (identical(other.request, request) || other.request == request)); - } - - @override - int get hashCode => Object.hash(runtimeType, request); - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$OnMutativeRequestSuccessImplCopyWith<_$OnMutativeRequestSuccessImpl> - get copyWith => __$$OnMutativeRequestSuccessImplCopyWithImpl< - _$OnMutativeRequestSuccessImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function( - RequestOptions request, Exception exception, StackTrace? stackTrace) - decodingError, - required TResult Function(RequestOptions request) authFailure, - required TResult Function(RequestOptions request) mutativeRequestSuccess, - }) { - return mutativeRequestSuccess(request); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(RequestOptions request, Exception exception, - StackTrace? stackTrace)? - decodingError, - TResult? Function(RequestOptions request)? authFailure, - TResult? Function(RequestOptions request)? mutativeRequestSuccess, - }) { - return mutativeRequestSuccess?.call(request); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(RequestOptions request, Exception exception, - StackTrace? stackTrace)? - decodingError, - TResult Function(RequestOptions request)? authFailure, - TResult Function(RequestOptions request)? mutativeRequestSuccess, - required TResult orElse(), - }) { - if (mutativeRequestSuccess != null) { - return mutativeRequestSuccess(request); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_JsonDecodingError value) decodingError, - required TResult Function(_AuthFailure value) authFailure, - required TResult Function(_OnMutativeRequestSuccess value) - mutativeRequestSuccess, - }) { - return mutativeRequestSuccess(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_JsonDecodingError value)? decodingError, - TResult? Function(_AuthFailure value)? authFailure, - TResult? Function(_OnMutativeRequestSuccess value)? mutativeRequestSuccess, - }) { - return mutativeRequestSuccess?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_JsonDecodingError value)? decodingError, - TResult Function(_AuthFailure value)? authFailure, - TResult Function(_OnMutativeRequestSuccess value)? mutativeRequestSuccess, - required TResult orElse(), - }) { - if (mutativeRequestSuccess != null) { - return mutativeRequestSuccess(this); - } - return orElse(); - } -} - -abstract class _OnMutativeRequestSuccess implements SturdyHttpEvent { - const factory _OnMutativeRequestSuccess(final RequestOptions request) = - _$OnMutativeRequestSuccessImpl; - - @override - RequestOptions get request; - - /// Create a copy of SturdyHttpEvent - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$OnMutativeRequestSuccessImplCopyWith<_$OnMutativeRequestSuccessImpl> - get copyWith => throw _privateConstructorUsedError; -} diff --git a/lib/sturdy_http.dart b/lib/sturdy_http.dart index 1f15dcc..815a59d 100644 --- a/lib/sturdy_http.dart +++ b/lib/sturdy_http.dart @@ -1,6 +1,3 @@ -/// A strongly typed, event-based, reliable HTTP client that wraps Dio. -library sturdy_http; - export 'src/_dio_error.dart'; export 'src/network_request.dart'; export 'src/network_response.dart'; diff --git a/pubspec.yaml b/pubspec.yaml index 4b5d4eb..da0f3f7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,23 +1,18 @@ name: sturdy_http description: A strongly typed, event-based, reliable HTTP client that wraps `Dio`. -version: 0.5.1 +version: 0.6.0 homepage: https://github.com/Betterment/sturdy_http repository: https://github.com/Betterment/sturdy_http environment: - sdk: ">=3.5.0 <4.0.0" + sdk: '>=3.10.0 <4.0.0' dependencies: - collection: ^1.18.0 - dio: ^5.7.0 - freezed_annotation: ^2.4.4 - uuid: ^4.5.0 + collection: ^1.19.1 + dio: ^5.9.0 + uuid: ^4.5.2 dev_dependencies: - build_runner: ^2.4.12 - charlatan: ^0.4.0 - freezed: ^2.5.7 - json_annotation: ^4.9.0 - json_serializable: ^6.8.0 - lints: ^4.0.0 - test: ^1.25.8 + charlatan: ^0.5.0 + lints: ^6.0.0 + test: ^1.28.0 diff --git a/test/src/deserializer_test.dart b/test/src/deserializer_test.dart index 6c6f858..e3acdb0 100644 --- a/test/src/deserializer_test.dart +++ b/test/src/deserializer_test.dart @@ -2,7 +2,6 @@ import 'dart:isolate'; -import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:sturdy_http/sturdy_http.dart'; import 'package:test/test.dart'; @@ -10,36 +9,38 @@ import 'sturdy_http_test.dart'; void main() { group('BackgroundDeserializer', () { - test('it invokes onResponse on a non-main Isolate and sends result back', - () async { - onResponse(NetworkResponse response) { - final isolateName = Isolate.current.debugName; - // Hijack `Foo` to send over the `IsolateName` since - // isolates don't share memory (so we can't set a late - // field that lives outside this isolate function - // scope) - return Foo(message: isolateName!); - } + test( + 'it invokes onResponse on a non-main Isolate and sends result back', + () async { + onResponse(NetworkResponse response) { + final isolateName = Isolate.current.debugName; + // Hijack `Foo` to send over the `IsolateName` since + // isolates don't share memory (so we can't set a late + // field that lives outside this isolate function + // scope) + return Foo(message: isolateName!); + } - final response = OkResponse(const Foo(message: '--').toJson()); - final subject = BackgroundDeserializer(); - final result = await subject.deserialize( - response: response, - onResponse: onResponse, - ); - expect(result.message, 'sturdyHttpWorkerIsolate'); - }); + final response = OkResponse(const Foo(message: '--').toMap()); + final subject = BackgroundDeserializer(); + final result = await subject.deserialize( + response: response, + onResponse: onResponse, + ); + expect(result.message, 'sturdyHttpWorkerIsolate'); + }, + ); test('it handles multiple requests for deserialization', () async { Foo onResponse(NetworkResponse response) { return switch (response) { - OkResponse(:final response) => Foo.fromJson(response), + OkResponse(:final response) => Foo.fromMap(response), _ => fail('Not expected: orElse'), }; } - final responseOne = OkResponse(const Foo(message: '1').toJson()); - final responseTwo = OkResponse(const Foo(message: '2').toJson()); + final responseOne = OkResponse(const Foo(message: '1').toMap()); + final responseTwo = OkResponse(const Foo(message: '2').toMap()); final subject = BackgroundDeserializer(); final resultOne = await subject.deserialize( response: responseOne, @@ -53,25 +54,29 @@ void main() { expect(resultTwo.message, '2'); }); - test( - 'it throws CheckedFromJsonExceptions when deserialization issues occur', - () async { + test('it rethrows Exceptions when deserialization issues occur', () async { onResponse(NetworkResponse response) { return switch (response) { - OkResponse(:final response) => NotFoo.fromJson(response), + OkResponse(:final response) => NotFoo.fromMap(response), _ => fail('orElse not expected'), }; } - final response = OkResponse(const Foo(message: 'Nope').toJson()); + final response = OkResponse(const Foo(message: 'Nope').toMap()); final subject = BackgroundDeserializer(); try { - await subject.deserialize( - response: response, - onResponse: onResponse, - ); + await subject.deserialize(response: response, onResponse: onResponse); } on Exception catch (e) { - expect(e, isA()); + expect( + e, + isA().having( + (e) => e.toString(), + 'description', + contains( + "sturdyHttpWorkerIsolate type 'Null' is not a subtype of type 'String'", + ), + ), + ); } }); }); diff --git a/test/src/retry_behavior_test.dart b/test/src/retry_behavior_test.dart index daf9daa..e9ee74c 100644 --- a/test/src/retry_behavior_test.dart +++ b/test/src/retry_behavior_test.dart @@ -34,10 +34,7 @@ void main() { }); group('Retry', () { test('maxRetries is respected', () { - final retry = const Retry( - maxRetries: 1, - retryInterval: Duration.zero, - ); + final retry = const Retry(maxRetries: 1, retryInterval: Duration.zero); expect( retry.shouldRetry( diff --git a/test/src/sturdy_http_test.dart b/test/src/sturdy_http_test.dart index de2a328..e60c7da 100644 --- a/test/src/sturdy_http_test.dart +++ b/test/src/sturdy_http_test.dart @@ -2,13 +2,9 @@ import 'dart:io'; import 'package:charlatan/charlatan.dart'; import 'package:dio/dio.dart'; -import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:sturdy_http/sturdy_http.dart'; import 'package:test/test.dart' hide Retry; -part 'sturdy_http_test.freezed.dart'; -part 'sturdy_http_test.g.dart'; - void main() { group('SturdyHttp', () { late Charlatan charlatan; @@ -83,7 +79,7 @@ void main() { charlatan.whenPost('/infer', (request) => CharlatanHttpResponse()); await subject.execute( - PostRequest('/infer', data: NetworkRequestBody.json({'foo': 'bar'})), + PostRequest('/infer', data: JsonRequestBody({'foo': 'bar'})), onResponse: (r) {}, ); @@ -107,7 +103,7 @@ void main() { charlatan.whenPost('/infer', (request) => CharlatanHttpResponse()); await subject.execute( - PostRequest('/infer', data: NetworkRequestBody.json({'foo': 'bar'})), + PostRequest('/infer', data: JsonRequestBody({'foo': 'bar'})), onResponse: (r) {}, ); @@ -134,19 +130,18 @@ void main() { group('withBaseUrl', () { test( - 'it returns a new instance with correct baseUrl and pre-configured settings', - () { - final oldInstance = buildSubject( - interceptors: [_FakeInterceptor()], - ); - expect(oldInstance.baseUrl != 'https://foo.com', isTrue); - - final newInstance = oldInstance.withBaseUrl('https://foo.com'); - expect(identical(oldInstance, newInstance), isFalse); - expect(newInstance.baseUrl, 'https://foo.com'); - expect(newInstance.interceptors, oldInstance.interceptors); - expect(newInstance.httpClientAdapter, oldInstance.httpClientAdapter); - }); + 'it returns a new instance with correct baseUrl and pre-configured settings', + () { + final oldInstance = buildSubject(interceptors: [_FakeInterceptor()]); + expect(oldInstance.baseUrl != 'https://foo.com', isTrue); + + final newInstance = oldInstance.withBaseUrl('https://foo.com'); + expect(identical(oldInstance, newInstance), isFalse); + expect(newInstance.baseUrl, 'https://foo.com'); + expect(newInstance.interceptors, oldInstance.interceptors); + expect(newInstance.httpClientAdapter, oldInstance.httpClientAdapter); + }, + ); }); group('execute', () { @@ -186,11 +181,7 @@ void main() { await buildSubject().execute( const GetRequest( '/foo', - data: NetworkRequestBody.json( - { - 'foo': 'bar', - }, - ), + data: JsonRequestBody({'foo': 'bar'}), ), onResponse: (response) { return null; @@ -210,11 +201,7 @@ void main() { await buildSubject().execute( GetRequest( '/foo', - data: NetworkRequestBody.json( - { - 'foo': 'bar', - }, - ), + data: JsonRequestBody({'foo': 'bar'}), options: Options(extra: {'foo': 'bar'}), ), onResponse: (response) { @@ -257,10 +244,7 @@ void main() { ); expect(options.method, 'GET'); await buildSubject().execute( - const PostRequest( - '/bar', - data: NetworkRequestBody.empty(), - ), + const PostRequest('/bar', data: EmptyRequestBody()), onResponse: (response) {}, ); expect(options.method, 'POST'); @@ -277,13 +261,13 @@ void main() { ..whenGet( '/foo', (request) => CharlatanHttpResponse( - body: Foo(message: 'Hello world').toJson(), + body: Foo(message: 'Hello world').toMap(), ), ) ..whenGet( '/not-foo', (request) => CharlatanHttpResponse( - body: NotFoo(notMessage: 'Hello world').toJson(), + body: NotFoo(notMessage: 'Hello world').toMap(), ), ) ..whenGet( @@ -294,51 +278,48 @@ void main() { group('when deserialization succeeds', () { test('it returns parsed model', () async { - final response = - await buildSubject().execute>( - const GetRequest('/foo'), - onResponse: (response) { - return switch (response) { - OkResponse(:final response) => - Result.success(Foo.fromJson(response)), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); - - response.when( - success: (foo) => expect(foo.message, 'Hello world'), - failure: fail, - ); + final response = await buildSubject() + .execute>( + const GetRequest('/foo'), + onResponse: (response) { + return switch (response) { + OkResponse(:final response) => Success( + Foo.fromMap(response), + ), + _ => const Failure('Not expected: orElse'), + }; + }, + ); + + switch (response) { + case Success(:final success): + expect(success.message, 'Hello world'); + case Failure(): + fail('Expected Success'); + } }); }); group('when deserialization fails', () { test( - 'it emits a decodingError event and rethrows the Exception', - () async { - final request = - buildSubject().execute>( - const GetRequest('/not-foo'), - onResponse: (response) { - return switch (response) { - OkResponse(:final response) => - Result.success(Foo.fromJson(response)), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); - - await expectLater( - request, - throwsA(isA()), - ); - - expect( - jsonDecodingErrors['/not-foo'].toString(), - contains('CheckedFromJsonException'), - ); - }); + 'it emits a decodingError event and rethrows the Exception', + () async { + final request = buildSubject() + .execute>( + const GetRequest('/not-foo'), + onResponse: (response) { + return switch (response) { + OkResponse(:final response) => Success( + Foo.fromMap(response), + ), + _ => const Failure('Not expected: orElse'), + }; + }, + ); + + await expectLater(request, throwsA(isA())); + }, + ); }); }); @@ -347,31 +328,28 @@ void main() { setUp(() { charlatan.whenPost( '/foo', - (request) => CharlatanHttpResponse( - statusCode: 204, - body: null, - ), + (request) => + CharlatanHttpResponse(statusCode: 204, body: null), ); }); test('it returns okNoContent', () async { - final response = - await buildSubject().execute>( - const PostRequest( - '/foo', - data: NetworkRequestBody.empty(), - ), - onResponse: (response) { - return switch (response) { - OkNoContent() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); - - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + final response = await buildSubject() + .execute>( + const PostRequest('/foo', data: EmptyRequestBody()), + onResponse: (response) { + return switch (response) { + OkNoContent() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); + + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }); }); @@ -379,10 +357,8 @@ void main() { setUp(() { charlatan.whenPost( '/foo', - (request) => CharlatanHttpResponse( - statusCode: 200, - body: null, - ), + (request) => + CharlatanHttpResponse(statusCode: 200, body: null), ); }); test( @@ -390,27 +366,26 @@ void main() { () async { final response = await buildSubject() .execute>( - const PostRequest( - '/foo', - data: NetworkRequestBody.empty(), - ), - onResponse: (response) { - return switch (response) { - GenericError(:final isConnectionIssue) => () { - { - expect(isConnectionIssue, isFalse); - return const Result.success(true); - } - }(), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); - - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + const PostRequest('/foo', data: EmptyRequestBody()), + onResponse: (response) { + return switch (response) { + GenericError(:final isConnectionIssue) => () { + { + expect(isConnectionIssue, isFalse); + return const Success(true); + } + }(), + _ => const Failure('Not expected: orElse'), + }; + }, + ); + + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }, ); }); @@ -446,141 +421,134 @@ void main() { }); test( - 'it emits a MutativeRequestSuccess event with correct path', - () async { - final subject = buildSubject(); - await Future.wait([ - subject.execute>( - const PostRequest( - '/foo', - data: NetworkRequestBody.empty(), + 'it emits a MutativeRequestSuccess event with correct path', + () async { + final subject = buildSubject(); + await Future.wait([ + subject.execute>( + const PostRequest('/foo', data: EmptyRequestBody()), + onResponse: (response) { + return switch (response) { + OkResponse(:final response) => Success( + response['foo'] as String, + ), + _ => const Failure('Not expected: orElse'), + }; + }, ), - onResponse: (response) { - return switch (response) { - OkResponse(:final response) => - Result.success(response['foo'] as String), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ), - subject.execute>( - const PutRequest( - '/bar', - data: NetworkRequestBody.empty(), + subject.execute>( + const PutRequest('/bar', data: EmptyRequestBody()), + onResponse: (response) { + return switch (response) { + OkResponse(:final response) => Success( + response['foo'] as String, + ), + _ => const Failure('Not expected: orElse'), + }; + }, ), - onResponse: (response) { - return switch (response) { - OkResponse(:final response) => - Result.success(response['foo'] as String), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ), - subject.execute>( - const DeleteRequest( - '/baz', - data: NetworkRequestBody.empty(), + subject.execute>( + const DeleteRequest('/baz', data: EmptyRequestBody()), + onResponse: (response) { + return switch (response) { + OkResponse(:final response) => Success( + response['foo'] as String, + ), + _ => const Failure('Not expected: orElse'), + }; + }, ), - onResponse: (response) { - return switch (response) { - OkResponse(:final response) => - Result.success(response['foo'] as String), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ), - ]); - - expect( - mutativeRequestSuccessRequests.map((e) => e.path), - contains('/foo'), - ); - expect( - mutativeRequestSuccessRequests.map((e) => e.path), - contains('/bar'), - ); - expect( - mutativeRequestSuccessRequests.map((e) => e.path), - contains('/baz'), - ); - }); - }); + ]); - group('and the response has status codes other than 200 or 204', - () { - setUp(() { - charlatan - ..whenPost( - '/foo', - (request) => CharlatanHttpResponse( - body: {}, - statusCode: 404, - ), - ) - ..whenPut( - '/bar', - (request) => CharlatanHttpResponse( - body: {}, - statusCode: 422, - ), - ) - ..whenDelete( - '/baz', - (request) => CharlatanHttpResponse( - body: {}, - statusCode: 500, - ), + expect( + mutativeRequestSuccessRequests.map((e) => e.path), + contains('/foo'), ); - }); + expect( + mutativeRequestSuccessRequests.map((e) => e.path), + contains('/bar'), + ); + expect( + mutativeRequestSuccessRequests.map((e) => e.path), + contains('/baz'), + ); + }, + ); + }); - test('it does not emit a MutativeRequestSuccess event', - () async { - final subject = buildSubject(); - await Future.wait([ - subject.execute>( - const PostRequest( + group( + 'and the response has status codes other than 200 or 204', + () { + setUp(() { + charlatan + ..whenPost( '/foo', - data: NetworkRequestBody.empty(), - ), - onResponse: (response) { - return switch (response) { - OkResponse(:final response) => - Result.success(response['foo'] as String), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ), - subject.execute>( - const PutRequest( + (request) => CharlatanHttpResponse( + body: {}, + statusCode: 404, + ), + ) + ..whenPut( '/bar', - data: NetworkRequestBody.empty(), - ), - onResponse: (response) { - return switch (response) { - OkResponse(:final response) => - Result.success(response['foo'] as String), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ), - subject.execute>( - const DeleteRequest( + (request) => CharlatanHttpResponse( + body: {}, + statusCode: 422, + ), + ) + ..whenDelete( '/baz', - data: NetworkRequestBody.empty(), - ), - onResponse: (response) { - return switch (response) { - OkResponse(:final response) => - Result.success(response['foo'] as String), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ), - ]); - - expect(mutativeRequestSuccessRequests.isEmpty, true); - }); - }); + (request) => CharlatanHttpResponse( + body: {}, + statusCode: 500, + ), + ); + }); + + test( + 'it does not emit a MutativeRequestSuccess event', + () async { + final subject = buildSubject(); + await Future.wait([ + subject.execute>( + const PostRequest('/foo', data: EmptyRequestBody()), + onResponse: (response) { + return switch (response) { + OkResponse(:final response) => Success( + response['foo'] as String, + ), + _ => const Failure('Not expected: orElse'), + }; + }, + ), + subject.execute>( + const PutRequest('/bar', data: EmptyRequestBody()), + onResponse: (response) { + return switch (response) { + OkResponse(:final response) => Success( + response['foo'] as String, + ), + _ => const Failure('Not expected: orElse'), + }; + }, + ), + subject.execute>( + const DeleteRequest('/baz', data: EmptyRequestBody()), + onResponse: (response) { + return switch (response) { + OkResponse(:final response) => Success( + response['foo'] as String, + ), + _ => const Failure('Not expected: orElse'), + }; + }, + ), + ]); + + expect(mutativeRequestSuccessRequests.isEmpty, true); + }, + ); + }, + ); }); }); }); @@ -594,10 +562,8 @@ void main() { }) { charlatan.whenGet( path, - (request) => CharlatanHttpResponse( - statusCode: statusCode, - body: body, - ), + (request) => + CharlatanHttpResponse(statusCode: statusCode, body: body), ); } @@ -606,26 +572,30 @@ void main() { setupErrorResponse(statusCode: 401); }); - test('it emits an authFailure event and invokes unauthorized', - () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - Unauthorized() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + test( + 'it emits an authFailure event and invokes unauthorized', + () async { + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + Unauthorized() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - expect(authFailureRequests.single.path, '/foo'); + expect(authFailureRequests.single.path, '/foo'); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); - }); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } + }, + ); }); group('when status code is 403', () { @@ -634,21 +604,23 @@ void main() { }); test('it returns forbidden', () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - Forbidden() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + Forbidden() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }); }); @@ -658,21 +630,23 @@ void main() { }); test('it returns notFound', () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - NotFound() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + NotFound() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }); }); @@ -680,26 +654,28 @@ void main() { setUp(() { setupErrorResponse( statusCode: 422, - body: const Foo(message: 'error').toJson(), + body: const Foo(message: 'error').toMap(), ); }); test('it returns unprocessableEntity', () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - UnprocessableEntity() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + UnprocessableEntity() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }); }); @@ -707,26 +683,28 @@ void main() { setUp(() { setupErrorResponse( statusCode: 426, - body: const Foo(message: 'error').toJson(), + body: const Foo(message: 'error').toMap(), ); }); test('it returns upgradeRequired', () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - UpgradeRequired() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + UpgradeRequired() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }); }); @@ -736,21 +714,23 @@ void main() { }); test('it returns serverError', () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - ServerError() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + ServerError() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }); }); @@ -760,21 +740,23 @@ void main() { }); test('it returns service unavailable', () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - ServiceUnavailable() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + ServiceUnavailable() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }); }); @@ -784,21 +766,23 @@ void main() { }); test('it returns genericError', () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - GenericError() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + GenericError() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } }); }); @@ -810,67 +794,67 @@ void main() { ); }); - test('it returns genericError and isConnectionIssue is true', - () async { - final response = - await buildSubject().execute>( - const GetRequest(defaultPath), - onResponse: (response) { - return switch (response) { - GenericError(:final isConnectionIssue) => () { - { - expect(isConnectionIssue, isTrue); - return const Result.success(true); - } - }(), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + test( + 'it returns genericError and isConnectionIssue is true', + () async { + final response = await buildSubject() + .execute>( + const GetRequest(defaultPath), + onResponse: (response) { + return switch (response) { + GenericError(:final isConnectionIssue) => () { + { + expect(isConnectionIssue, isTrue); + return const Success(true); + } + }(), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - response.when( - success: (s) => expect(s, isTrue), - failure: fail, - ); - }); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } + }, + ); }); group('RetryBehavior', () { group('when retry behavior is Retry', () { test('it retries maxRetries times', () async { var requestCount = 0; - charlatan.whenGet( - '/foo', - (request) { - requestCount++; - return CharlatanHttpResponse(statusCode: 522); - }, - ); + charlatan.whenGet('/foo', (request) { + requestCount++; + return CharlatanHttpResponse(statusCode: 522); + }); - final response = - await buildSubject().execute>( - const GetRequest( - defaultPath, - retryBehavior: Retry( - maxRetries: 3, - retryInterval: Duration(milliseconds: 100), - ), - ), - onResponse: (response) { - return switch (response) { - GenericError() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest( + defaultPath, + retryBehavior: Retry( + maxRetries: 3, + retryInterval: Duration(milliseconds: 100), + ), + ), + onResponse: (response) { + return switch (response) { + GenericError() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - expect( - response.when( - success: (s) => s, - failure: fail, - ), - isTrue, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } // maxRetries + 1 expect(requestCount, 4); }); @@ -879,35 +863,26 @@ void main() { group('when retry behavior is NeverRetry', () { test('it does not retry', () async { var requestCount = 0; - charlatan.whenGet( - '/foo', - (request) { - requestCount++; - return CharlatanHttpResponse(statusCode: 522); - }, - ); + charlatan.whenGet('/foo', (request) { + requestCount++; + return CharlatanHttpResponse(statusCode: 522); + }); - final response = - await buildSubject().execute>( - const GetRequest( - defaultPath, - retryBehavior: NeverRetry(), - ), - onResponse: (response) { - return switch (response) { - GenericError() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject() + .execute>( + const GetRequest( + defaultPath, + retryBehavior: NeverRetry(), + ), + onResponse: (response) { + return switch (response) { + GenericError() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - expect( - response.when( - success: (s) => s, - failure: fail, - ), - isTrue, - ); + expect((response as Success).success, isTrue); expect(requestCount, 1); }); }); @@ -915,39 +890,34 @@ void main() { group('RetryBehavior priority', () { test('it prefers local RetryBehavior to global', () async { var requestCount = 0; - charlatan.whenGet( - '/foo', - (request) { - requestCount++; - return CharlatanHttpResponse(statusCode: 522); - }, - ); + charlatan.whenGet('/foo', (request) { + requestCount++; + return CharlatanHttpResponse(statusCode: 522); + }); - final response = await buildSubject( - retryBehavior: NeverRetry(), - ).execute>( - const GetRequest( - defaultPath, - retryBehavior: Retry( - maxRetries: 2, - retryInterval: Duration(milliseconds: 100), - ), - ), - onResponse: (response) { - return switch (response) { - GenericError() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + final response = await buildSubject(retryBehavior: NeverRetry()) + .execute>( + const GetRequest( + defaultPath, + retryBehavior: Retry( + maxRetries: 2, + retryInterval: Duration(milliseconds: 100), + ), + ), + onResponse: (response) { + return switch (response) { + GenericError() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; + }, + ); - expect( - response.when( - success: (s) => s, - failure: fail, - ), - isTrue, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } expect(requestCount, 3); }); }); @@ -956,43 +926,38 @@ void main() { test('it allows overriding retryClause', () async { var requestCount = 0; final statusCode = defaultRetryStatusCodes.first; - charlatan.whenGet( - '/foo', - (request) { - requestCount++; - return CharlatanHttpResponse(statusCode: statusCode); - }, - ); + charlatan.whenGet('/foo', (request) { + requestCount++; + return CharlatanHttpResponse(statusCode: statusCode); + }); - final response = await buildSubject( - retryBehavior: NeverRetry(), - ).execute>( - GetRequest( - defaultPath, - retryBehavior: Retry( - maxRetries: 2, - retryInterval: Duration(milliseconds: 100), - retryClause: (r) { - // Body will be `null`; essentially disallow retrying - return r != null; + final response = await buildSubject(retryBehavior: NeverRetry()) + .execute>( + GetRequest( + defaultPath, + retryBehavior: Retry( + maxRetries: 2, + retryInterval: Duration(milliseconds: 100), + retryClause: (r) { + // Body will be `null`; essentially disallow retrying + return r != null; + }, + ), + ), + onResponse: (response) { + return switch (response) { + GenericError() => const Success(true), + _ => const Failure('Not expected: orElse'), + }; }, - ), - ), - onResponse: (response) { - return switch (response) { - GenericError() => const Result.success(true), - _ => const Result.failure('Not expected: orElse'), - }; - }, - ); + ); - expect( - response.when( - success: (s) => s, - failure: fail, - ), - isTrue, - ); + switch (response) { + case Success(:final success): + expect(success, isTrue); + case Failure(): + fail('Expected Success'); + } expect(requestCount, 1); }); }); @@ -1005,11 +970,20 @@ void main() { /// A simple representation of the result of a procedure that can fail, like /// a network request. -@freezed -class Result with _$Result { - const factory Result.success(S success) = _Success; +sealed class Result { + const Result(); +} + +final class Success extends Result { + final S success; + + const Success(this.success); +} + +final class Failure extends Result { + final F failure; - const factory Result.failure(F failure) = _Failure; + const Failure(this.failure); } class _FakeInterceptor extends Interceptor { @@ -1037,24 +1011,41 @@ class _SturdyHttpEventListener extends SturdyHttpEventListener { @override Future onEvent(SturdyHttpEvent event) async { - event.when( - decodingError: onDecodingError, - authFailure: onAuthFailure, - mutativeRequestSuccess: onMutativeRequestSuccess, - ); + switch (event) { + case DecodingError(:final request, :final exception, :final stackTrace): + onDecodingError(request, exception, stackTrace); + case AuthFailure(:final request): + onAuthFailure(request); + case MutativeRequestSuccess(:final request): + onMutativeRequestSuccess(request); + } } } -@freezed -class Foo with _$Foo { - const factory Foo({required String message}) = _Foo; +class Foo { + const Foo({required this.message}); + + final String message; - factory Foo.fromJson(Json json) => _$FooFromJson(json); + static Foo fromMap(Map map) { + return Foo(message: map['message'] as String); + } + + Map toMap() { + return {'message': message}; + } } -@freezed -class NotFoo with _$NotFoo { - const factory NotFoo({required String notMessage}) = _NotFoo; +class NotFoo { + const NotFoo({required this.notMessage}); - factory NotFoo.fromJson(Json json) => _$NotFooFromJson(json); + final String notMessage; + + static NotFoo fromMap(Map map) { + return NotFoo(notMessage: map['notMessage'] as String); + } + + Map toMap() { + return {'notMessage': notMessage}; + } } diff --git a/test/src/sturdy_http_test.freezed.dart b/test/src/sturdy_http_test.freezed.dart deleted file mode 100644 index c0d3331..0000000 --- a/test/src/sturdy_http_test.freezed.dart +++ /dev/null @@ -1,647 +0,0 @@ -// coverage:ignore-file -// GENERATED CODE - DO NOT MODIFY BY HAND -// ignore_for_file: type=lint -// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark - -part of 'sturdy_http_test.dart'; - -// ************************************************************************** -// FreezedGenerator -// ************************************************************************** - -T _$identity(T value) => value; - -final _privateConstructorUsedError = UnsupportedError( - 'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models'); - -/// @nodoc -mixin _$Result { - @optionalTypeArgs - TResult when({ - required TResult Function(S success) success, - required TResult Function(F failure) failure, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(S success)? success, - TResult? Function(F failure)? failure, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(S success)? success, - TResult Function(F failure)? failure, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult map({ - required TResult Function(_Success value) success, - required TResult Function(_Failure value) failure, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Success value)? success, - TResult? Function(_Failure value)? failure, - }) => - throw _privateConstructorUsedError; - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Success value)? success, - TResult Function(_Failure value)? failure, - required TResult orElse(), - }) => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $ResultCopyWith { - factory $ResultCopyWith( - Result value, $Res Function(Result) then) = - _$ResultCopyWithImpl>; -} - -/// @nodoc -class _$ResultCopyWithImpl> - implements $ResultCopyWith { - _$ResultCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of Result - /// with the given fields replaced by the non-null parameter values. -} - -/// @nodoc -abstract class _$$SuccessImplCopyWith { - factory _$$SuccessImplCopyWith( - _$SuccessImpl value, $Res Function(_$SuccessImpl) then) = - __$$SuccessImplCopyWithImpl; - @useResult - $Res call({S success}); -} - -/// @nodoc -class __$$SuccessImplCopyWithImpl - extends _$ResultCopyWithImpl> - implements _$$SuccessImplCopyWith { - __$$SuccessImplCopyWithImpl( - _$SuccessImpl _value, $Res Function(_$SuccessImpl) _then) - : super(_value, _then); - - /// Create a copy of Result - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? success = freezed, - }) { - return _then(_$SuccessImpl( - freezed == success - ? _value.success - : success // ignore: cast_nullable_to_non_nullable - as S, - )); - } -} - -/// @nodoc - -class _$SuccessImpl implements _Success { - const _$SuccessImpl(this.success); - - @override - final S success; - - @override - String toString() { - return 'Result<$S, $F>.success(success: $success)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$SuccessImpl && - const DeepCollectionEquality().equals(other.success, success)); - } - - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(success)); - - /// Create a copy of Result - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$SuccessImplCopyWith> get copyWith => - __$$SuccessImplCopyWithImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(S success) success, - required TResult Function(F failure) failure, - }) { - return success(this.success); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(S success)? success, - TResult? Function(F failure)? failure, - }) { - return success?.call(this.success); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(S success)? success, - TResult Function(F failure)? failure, - required TResult orElse(), - }) { - if (success != null) { - return success(this.success); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_Success value) success, - required TResult Function(_Failure value) failure, - }) { - return success(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Success value)? success, - TResult? Function(_Failure value)? failure, - }) { - return success?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Success value)? success, - TResult Function(_Failure value)? failure, - required TResult orElse(), - }) { - if (success != null) { - return success(this); - } - return orElse(); - } -} - -abstract class _Success implements Result { - const factory _Success(final S success) = _$SuccessImpl; - - S get success; - - /// Create a copy of Result - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$SuccessImplCopyWith> get copyWith => - throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class _$$FailureImplCopyWith { - factory _$$FailureImplCopyWith( - _$FailureImpl value, $Res Function(_$FailureImpl) then) = - __$$FailureImplCopyWithImpl; - @useResult - $Res call({F failure}); -} - -/// @nodoc -class __$$FailureImplCopyWithImpl - extends _$ResultCopyWithImpl> - implements _$$FailureImplCopyWith { - __$$FailureImplCopyWithImpl( - _$FailureImpl _value, $Res Function(_$FailureImpl) _then) - : super(_value, _then); - - /// Create a copy of Result - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? failure = freezed, - }) { - return _then(_$FailureImpl( - freezed == failure - ? _value.failure - : failure // ignore: cast_nullable_to_non_nullable - as F, - )); - } -} - -/// @nodoc - -class _$FailureImpl implements _Failure { - const _$FailureImpl(this.failure); - - @override - final F failure; - - @override - String toString() { - return 'Result<$S, $F>.failure(failure: $failure)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FailureImpl && - const DeepCollectionEquality().equals(other.failure, failure)); - } - - @override - int get hashCode => - Object.hash(runtimeType, const DeepCollectionEquality().hash(failure)); - - /// Create a copy of Result - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FailureImplCopyWith> get copyWith => - __$$FailureImplCopyWithImpl>(this, _$identity); - - @override - @optionalTypeArgs - TResult when({ - required TResult Function(S success) success, - required TResult Function(F failure) failure, - }) { - return failure(this.failure); - } - - @override - @optionalTypeArgs - TResult? whenOrNull({ - TResult? Function(S success)? success, - TResult? Function(F failure)? failure, - }) { - return failure?.call(this.failure); - } - - @override - @optionalTypeArgs - TResult maybeWhen({ - TResult Function(S success)? success, - TResult Function(F failure)? failure, - required TResult orElse(), - }) { - if (failure != null) { - return failure(this.failure); - } - return orElse(); - } - - @override - @optionalTypeArgs - TResult map({ - required TResult Function(_Success value) success, - required TResult Function(_Failure value) failure, - }) { - return failure(this); - } - - @override - @optionalTypeArgs - TResult? mapOrNull({ - TResult? Function(_Success value)? success, - TResult? Function(_Failure value)? failure, - }) { - return failure?.call(this); - } - - @override - @optionalTypeArgs - TResult maybeMap({ - TResult Function(_Success value)? success, - TResult Function(_Failure value)? failure, - required TResult orElse(), - }) { - if (failure != null) { - return failure(this); - } - return orElse(); - } -} - -abstract class _Failure implements Result { - const factory _Failure(final F failure) = _$FailureImpl; - - F get failure; - - /// Create a copy of Result - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FailureImplCopyWith> get copyWith => - throw _privateConstructorUsedError; -} - -Foo _$FooFromJson(Map json) { - return _Foo.fromJson(json); -} - -/// @nodoc -mixin _$Foo { - String get message => throw _privateConstructorUsedError; - - /// Serializes this Foo to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of Foo - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $FooCopyWith get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $FooCopyWith<$Res> { - factory $FooCopyWith(Foo value, $Res Function(Foo) then) = - _$FooCopyWithImpl<$Res, Foo>; - @useResult - $Res call({String message}); -} - -/// @nodoc -class _$FooCopyWithImpl<$Res, $Val extends Foo> implements $FooCopyWith<$Res> { - _$FooCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of Foo - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? message = null, - }) { - return _then(_value.copyWith( - message: null == message - ? _value.message - : message // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$FooImplCopyWith<$Res> implements $FooCopyWith<$Res> { - factory _$$FooImplCopyWith(_$FooImpl value, $Res Function(_$FooImpl) then) = - __$$FooImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({String message}); -} - -/// @nodoc -class __$$FooImplCopyWithImpl<$Res> extends _$FooCopyWithImpl<$Res, _$FooImpl> - implements _$$FooImplCopyWith<$Res> { - __$$FooImplCopyWithImpl(_$FooImpl _value, $Res Function(_$FooImpl) _then) - : super(_value, _then); - - /// Create a copy of Foo - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? message = null, - }) { - return _then(_$FooImpl( - message: null == message - ? _value.message - : message // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$FooImpl implements _Foo { - const _$FooImpl({required this.message}); - - factory _$FooImpl.fromJson(Map json) => - _$$FooImplFromJson(json); - - @override - final String message; - - @override - String toString() { - return 'Foo(message: $message)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$FooImpl && - (identical(other.message, message) || other.message == message)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, message); - - /// Create a copy of Foo - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$FooImplCopyWith<_$FooImpl> get copyWith => - __$$FooImplCopyWithImpl<_$FooImpl>(this, _$identity); - - @override - Map toJson() { - return _$$FooImplToJson( - this, - ); - } -} - -abstract class _Foo implements Foo { - const factory _Foo({required final String message}) = _$FooImpl; - - factory _Foo.fromJson(Map json) = _$FooImpl.fromJson; - - @override - String get message; - - /// Create a copy of Foo - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$FooImplCopyWith<_$FooImpl> get copyWith => - throw _privateConstructorUsedError; -} - -NotFoo _$NotFooFromJson(Map json) { - return _NotFoo.fromJson(json); -} - -/// @nodoc -mixin _$NotFoo { - String get notMessage => throw _privateConstructorUsedError; - - /// Serializes this NotFoo to a JSON map. - Map toJson() => throw _privateConstructorUsedError; - - /// Create a copy of NotFoo - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - $NotFooCopyWith get copyWith => throw _privateConstructorUsedError; -} - -/// @nodoc -abstract class $NotFooCopyWith<$Res> { - factory $NotFooCopyWith(NotFoo value, $Res Function(NotFoo) then) = - _$NotFooCopyWithImpl<$Res, NotFoo>; - @useResult - $Res call({String notMessage}); -} - -/// @nodoc -class _$NotFooCopyWithImpl<$Res, $Val extends NotFoo> - implements $NotFooCopyWith<$Res> { - _$NotFooCopyWithImpl(this._value, this._then); - - // ignore: unused_field - final $Val _value; - // ignore: unused_field - final $Res Function($Val) _then; - - /// Create a copy of NotFoo - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? notMessage = null, - }) { - return _then(_value.copyWith( - notMessage: null == notMessage - ? _value.notMessage - : notMessage // ignore: cast_nullable_to_non_nullable - as String, - ) as $Val); - } -} - -/// @nodoc -abstract class _$$NotFooImplCopyWith<$Res> implements $NotFooCopyWith<$Res> { - factory _$$NotFooImplCopyWith( - _$NotFooImpl value, $Res Function(_$NotFooImpl) then) = - __$$NotFooImplCopyWithImpl<$Res>; - @override - @useResult - $Res call({String notMessage}); -} - -/// @nodoc -class __$$NotFooImplCopyWithImpl<$Res> - extends _$NotFooCopyWithImpl<$Res, _$NotFooImpl> - implements _$$NotFooImplCopyWith<$Res> { - __$$NotFooImplCopyWithImpl( - _$NotFooImpl _value, $Res Function(_$NotFooImpl) _then) - : super(_value, _then); - - /// Create a copy of NotFoo - /// with the given fields replaced by the non-null parameter values. - @pragma('vm:prefer-inline') - @override - $Res call({ - Object? notMessage = null, - }) { - return _then(_$NotFooImpl( - notMessage: null == notMessage - ? _value.notMessage - : notMessage // ignore: cast_nullable_to_non_nullable - as String, - )); - } -} - -/// @nodoc -@JsonSerializable() -class _$NotFooImpl implements _NotFoo { - const _$NotFooImpl({required this.notMessage}); - - factory _$NotFooImpl.fromJson(Map json) => - _$$NotFooImplFromJson(json); - - @override - final String notMessage; - - @override - String toString() { - return 'NotFoo(notMessage: $notMessage)'; - } - - @override - bool operator ==(Object other) { - return identical(this, other) || - (other.runtimeType == runtimeType && - other is _$NotFooImpl && - (identical(other.notMessage, notMessage) || - other.notMessage == notMessage)); - } - - @JsonKey(includeFromJson: false, includeToJson: false) - @override - int get hashCode => Object.hash(runtimeType, notMessage); - - /// Create a copy of NotFoo - /// with the given fields replaced by the non-null parameter values. - @JsonKey(includeFromJson: false, includeToJson: false) - @override - @pragma('vm:prefer-inline') - _$$NotFooImplCopyWith<_$NotFooImpl> get copyWith => - __$$NotFooImplCopyWithImpl<_$NotFooImpl>(this, _$identity); - - @override - Map toJson() { - return _$$NotFooImplToJson( - this, - ); - } -} - -abstract class _NotFoo implements NotFoo { - const factory _NotFoo({required final String notMessage}) = _$NotFooImpl; - - factory _NotFoo.fromJson(Map json) = _$NotFooImpl.fromJson; - - @override - String get notMessage; - - /// Create a copy of NotFoo - /// with the given fields replaced by the non-null parameter values. - @override - @JsonKey(includeFromJson: false, includeToJson: false) - _$$NotFooImplCopyWith<_$NotFooImpl> get copyWith => - throw _privateConstructorUsedError; -} diff --git a/test/src/sturdy_http_test.g.dart b/test/src/sturdy_http_test.g.dart deleted file mode 100644 index da0d4d0..0000000 --- a/test/src/sturdy_http_test.g.dart +++ /dev/null @@ -1,39 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'sturdy_http_test.dart'; - -// ************************************************************************** -// JsonSerializableGenerator -// ************************************************************************** - -_$FooImpl _$$FooImplFromJson(Map json) => $checkedCreate( - r'_$FooImpl', - json, - ($checkedConvert) { - final val = _$FooImpl( - message: $checkedConvert('message', (v) => v as String), - ); - return val; - }, - ); - -Map _$$FooImplToJson(_$FooImpl instance) => { - 'message': instance.message, - }; - -_$NotFooImpl _$$NotFooImplFromJson(Map json) => $checkedCreate( - r'_$NotFooImpl', - json, - ($checkedConvert) { - final val = _$NotFooImpl( - notMessage: $checkedConvert('not_message', (v) => v as String), - ); - return val; - }, - fieldKeyMap: const {'notMessage': 'not_message'}, - ); - -Map _$$NotFooImplToJson(_$NotFooImpl instance) => - { - 'not_message': instance.notMessage, - };