Skip to content

Commit

Permalink
Clean up error generation using extensions
Browse files Browse the repository at this point in the history
  • Loading branch information
dhzdhd committed Jun 27, 2023
1 parent c8f7d01 commit a057df8
Show file tree
Hide file tree
Showing 7 changed files with 77 additions and 87 deletions.
42 changes: 42 additions & 0 deletions lib/errors.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import 'package:dio/dio.dart';

extension ErrorSegregation on Exception {
AppError segregate() {
if (this is AppError) {
return this as AppError;
} else if (this is DioError) {
final error = this as DioError;
return HttpError(
message: error.response.toString(),
stackTrace: error.stackTrace.toString(),
);
} else {
return GeneralError(message: toString(), stackTrace: 'No stacktrace');
}
}
}

sealed class AppError implements Exception {
String get message;
String get stackTrace;
}

class HttpError implements AppError {
@override
final String message;

@override
final String stackTrace;

HttpError({required this.message, required this.stackTrace});
}

class GeneralError implements AppError {
@override
final String message;

@override
final String stackTrace;

GeneralError({required this.message, required this.stackTrace});
}
2 changes: 1 addition & 1 deletion lib/src/accounts/controllers/auth_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:syncvault/src/accounts/models/auth_provider_model.dart';
import 'package:syncvault/src/accounts/models/folder_info_model.dart';
import 'package:syncvault/src/accounts/services/auth_service.dart';
import 'package:syncvault/src/home/models/error_model.dart';
import 'package:syncvault/errors.dart';

enum AuthProviderType {
oneDrive,
Expand Down
5 changes: 3 additions & 2 deletions lib/src/accounts/controllers/folder_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:syncvault/src/accounts/controllers/auth_controller.dart';
import 'package:syncvault/src/accounts/models/auth_provider_model.dart';
import 'package:syncvault/src/accounts/models/folder_model.dart';
import 'package:syncvault/src/accounts/services/drive_service.dart';
import 'package:syncvault/errors.dart';

final folderProvider =
StateNotifierProvider<FolderNotifier, List<FolderModel>>((ref) {
Expand Down Expand Up @@ -61,7 +62,7 @@ class FolderNotifier extends StateNotifier<List<FolderModel>> {
);
}

Future<Either<String, String>> create(
Future<Either<AppError, String>> create(
AuthProviderModel authModel,
String folderPath,
String folderName,
Expand Down Expand Up @@ -100,7 +101,7 @@ class FolderNotifier extends StateNotifier<List<FolderModel>> {
});
}

Future<Either<String, String>> upload(
Future<Either<AppError, String>> upload(
FolderModel folderModel,
Option<String> filePath,
) async {
Expand Down
48 changes: 7 additions & 41 deletions lib/src/accounts/services/auth_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import 'package:syncvault/src/accounts/controllers/auth_controller.dart';
import 'package:syncvault/src/accounts/models/auth_provider_model.dart';
import 'package:syncvault/src/accounts/models/folder_info_model.dart';
import 'package:syncvault/src/accounts/services/drive_service.dart';
import 'package:syncvault/src/home/models/error_model.dart';
import 'package:syncvault/errors.dart';

final dio = Dio();

Expand Down Expand Up @@ -105,11 +105,7 @@ final class DropBoxAuth implements AuthService {
),
);
}, (error, stackTrace) {
if (error is AppError) {
return error;
} else {
return GeneralError(message: error.toString(), stackTrace: '');
}
return (error as Exception).segregate();
});
}

Expand Down Expand Up @@ -145,13 +141,7 @@ final class DropBoxAuth implements AuthService {
return model;
}
}, (error, stackTrace) {
if (error is DioError) {
return HttpError(
message: error.response.toString(),
stackTrace: error.stackTrace.toString(),
);
}
return GeneralError(message: '', stackTrace: error.toString());
return (error as Exception).segregate();
});
}

Expand All @@ -170,14 +160,7 @@ final class DropBoxAuth implements AuthService {

return response.data!;
}, (error, stackTrace) {
if (error is DioError) {
return HttpError(
message: error.response.toString(),
stackTrace: error.stackTrace.toString(),
);
} else {
return GeneralError(message: error.toString(), stackTrace: '');
}
return (error as Exception).segregate();
});
}

Expand Down Expand Up @@ -293,11 +276,7 @@ final class OneDriveAuth implements AuthService {
),
);
}, (error, stackTrace) {
if (error is AppError) {
return error;
} else {
return GeneralError(message: error.toString(), stackTrace: '');
}
return (error as Exception).segregate();
});
}

Expand Down Expand Up @@ -334,13 +313,7 @@ final class OneDriveAuth implements AuthService {
return model;
}
}, (error, stackTrace) {
if (error is DioError) {
return HttpError(
message: error.response.toString(),
stackTrace: error.stackTrace.toString(),
);
}
return GeneralError(message: '', stackTrace: error.toString());
return (error as Exception).segregate();
});
}

Expand All @@ -359,14 +332,7 @@ final class OneDriveAuth implements AuthService {

return response.data!;
}, (error, stackTrace) {
if (error is DioError) {
return HttpError(
message: error.response.toString(),
stackTrace: error.stackTrace.toString(),
);
} else {
return GeneralError(message: error.toString(), stackTrace: '');
}
return (error as Exception).segregate();
});
}

Expand Down
38 changes: 21 additions & 17 deletions lib/src/accounts/services/drive_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,22 @@ import 'package:flutter/material.dart';
import 'package:fpdart/fpdart.dart';
import 'package:syncvault/src/accounts/models/auth_provider_model.dart';
import 'package:syncvault/src/accounts/models/folder_model.dart';
import 'package:syncvault/errors.dart';

final dio = Dio();

abstract interface class DriveService {
TaskEither<String, String> createFolder({
TaskEither<AppError, String> createFolder({
required Option<String> folderName,
required String accessToken,
required Option<String> folderId,
});
TaskEither<String, String> upload(
TaskEither<AppError, String> upload(
FolderModel folderModel,
AuthProviderModel authModel,
Option<String> filePath,
);
TaskEither<String, String> delete({
TaskEither<AppError, String> delete({
required FolderModel folderModel,
required AuthProviderModel authModel,
required String folderId,
Expand All @@ -31,7 +32,7 @@ class DropBox implements DriveService {
static const basePath = '/2/files';

@override
TaskEither<String, String> createFolder({
TaskEither<AppError, String> createFolder({
required Option<String> folderName,
required String accessToken,
required Option<String> folderId,
Expand All @@ -57,18 +58,20 @@ class DropBox implements DriveService {
);
return response.data!['metadata']['id'];
},
(error, stackTrace) => error.toString(),
(error, stackTrace) {
return (error as Exception).segregate();
},
);
}

@override
TaskEither<String, String> upload(FolderModel folderModel,
TaskEither<AppError, String> upload(FolderModel folderModel,
AuthProviderModel authModel, Option<String> filePath) {
throw UnimplementedError();
}

@override
TaskEither<String, String> delete(
TaskEither<AppError, String> delete(
{required FolderModel folderModel,
required AuthProviderModel authModel,
required String folderId}) {
Expand All @@ -81,7 +84,7 @@ class OneDrive implements DriveService {
static const basePath = '/beta/me/drive';

@override
TaskEither<String, String> createFolder({
TaskEither<AppError, String> createFolder({
required Option<String> folderName,
required String accessToken,
required Option<String> folderId,
Expand All @@ -105,12 +108,14 @@ class OneDrive implements DriveService {
);
return response.data!['id'];
},
(error, stackTrace) => error.toString(),
(error, stackTrace) {
return (error as Exception).segregate();
},
);
}

@override
TaskEither<String, String> upload(
TaskEither<AppError, String> upload(
FolderModel folderModel,
AuthProviderModel authModel,
Option<String> filePath,
Expand Down Expand Up @@ -155,7 +160,7 @@ class OneDrive implements DriveService {
).run();

result.match(
(l) => throw StateError(l),
(l) => throw l,
(r) => idMap[i.path] = r,
);
}
Expand Down Expand Up @@ -194,12 +199,14 @@ class OneDrive implements DriveService {

return 'Success';
},
(error, stackTrace) => error.toString(),
(error, stackTrace) {
return (error as Exception).segregate();
},
);
}

@override
TaskEither<String, String> delete({
TaskEither<AppError, String> delete({
required FolderModel folderModel,
required AuthProviderModel authModel,
required String folderId,
Expand All @@ -217,10 +224,7 @@ class OneDrive implements DriveService {
return 'Success';
},
(error, stackTrace) {
if (error is DioError) {
debugPrint(error.response.toString());
}
return 'Failure';
return (error as Exception).segregate();
},
);
}
Expand Down
24 changes: 0 additions & 24 deletions lib/src/home/models/error_model.dart

This file was deleted.

5 changes: 3 additions & 2 deletions lib/src/home/views/home_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -206,8 +206,9 @@ class _HomeViewState extends ConsumerState<HomeView> {

if (context.mounted) {
result.match(
(l) => context
.showErrorSnackBar(l),
(l) =>
context.showErrorSnackBar(
l.message),
(r) =>
context.showSuccessSnackBar(
content: r,
Expand Down

0 comments on commit a057df8

Please sign in to comment.