Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[compass_app] Standardize on Result factories rather than constructors #2538

Merged
merged 1 commit into from
Dec 5, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
[compass_app] Consistently use Result factories
  • Loading branch information
parlough committed Dec 5, 2024
commit ff41522265ff247e5dacc69d13c48c1be3fc8e0a
Original file line number Diff line number Diff line change
@@ -16,12 +16,12 @@ class AuthRepositoryDev extends AuthRepository {
required String email,
required String password,
}) async {
return Result.ok(null);
return const Result.ok(null);
}

/// Logout is always successful in dev scenarios
@override
Future<Result<void>> logout() async {
return Result.ok(null);
return const Result.ok(null);
}
}
Original file line number Diff line number Diff line change
@@ -31,7 +31,7 @@ class BookingRepositoryLocal implements BookingRepository {
// Bookings created come without id, we need to assign one
final bookingWithId = booking.copyWith(id: _sequentialId++);
_bookings.add(bookingWithId);
return Result.ok(null);
return const Result.ok(null);
}

@override
@@ -92,6 +92,6 @@ class BookingRepositoryLocal implements BookingRepository {
@override
Future<Result<void>> delete(int id) async {
_bookings.removeWhere((booking) => booking.id == id);
return Result.ok(null);
return const Result.ok(null);
}
}
Original file line number Diff line number Diff line change
@@ -22,6 +22,6 @@ class ItineraryConfigRepositoryMemory implements ItineraryConfigRepository {
ItineraryConfig itineraryConfig,
) async {
_itineraryConfig = itineraryConfig;
return Result.ok(true);
return const Result.ok(true);
}
}
18 changes: 9 additions & 9 deletions compass_app/app/lib/data/services/api/api_client.dart
Original file line number Diff line number Diff line change
@@ -53,7 +53,7 @@ class ApiClient {
return Result.ok(
json.map((element) => Continent.fromJson(element)).toList());
} else {
return Result.error(const HttpException("Invalid response"));
return const Result.error(HttpException("Invalid response"));
}
} on Exception catch (error) {
return Result.error(error);
@@ -74,7 +74,7 @@ class ApiClient {
return Result.ok(
json.map((element) => Destination.fromJson(element)).toList());
} else {
return Result.error(const HttpException("Invalid response"));
return const Result.error(HttpException("Invalid response"));
}
} on Exception catch (error) {
return Result.error(error);
@@ -97,7 +97,7 @@ class ApiClient {
json.map((element) => Activity.fromJson(element)).toList();
return Result.ok(activities);
} else {
return Result.error(const HttpException("Invalid response"));
return const Result.error(HttpException("Invalid response"));
}
} on Exception catch (error) {
return Result.error(error);
@@ -119,7 +119,7 @@ class ApiClient {
json.map((element) => BookingApiModel.fromJson(element)).toList();
return Result.ok(bookings);
} else {
return Result.error(const HttpException("Invalid response"));
return const Result.error(HttpException("Invalid response"));
}
} on Exception catch (error) {
return Result.error(error);
@@ -139,7 +139,7 @@ class ApiClient {
final booking = BookingApiModel.fromJson(jsonDecode(stringData));
return Result.ok(booking);
} else {
return Result.error(const HttpException("Invalid response"));
return const Result.error(HttpException("Invalid response"));
}
} on Exception catch (error) {
return Result.error(error);
@@ -160,7 +160,7 @@ class ApiClient {
final booking = BookingApiModel.fromJson(jsonDecode(stringData));
return Result.ok(booking);
} else {
return Result.error(const HttpException("Invalid response"));
return const Result.error(HttpException("Invalid response"));
}
} on Exception catch (error) {
return Result.error(error);
@@ -180,7 +180,7 @@ class ApiClient {
final user = UserApiModel.fromJson(jsonDecode(stringData));
return Result.ok(user);
} else {
return Result.error(const HttpException("Invalid response"));
return const Result.error(HttpException("Invalid response"));
}
} on Exception catch (error) {
return Result.error(error);
@@ -197,9 +197,9 @@ class ApiClient {
final response = await request.close();
// Response 204 "No Content", delete was successful
if (response.statusCode == 204) {
return Result.ok(null);
return const Result.ok(null);
} else {
return Result.error(const HttpException("Invalid response"));
return const Result.error(HttpException("Invalid response"));
}
} on Exception catch (error) {
return Result.error(error);
2 changes: 1 addition & 1 deletion compass_app/app/lib/data/services/api/auth_api_client.dart
Original file line number Diff line number Diff line change
@@ -32,7 +32,7 @@ class AuthApiClient {
final stringData = await response.transform(utf8.decoder).join();
return Result.ok(LoginResponse.fromJson(jsonDecode(stringData)));
} else {
return Result.error(const HttpException("Login error"));
return const Result.error(HttpException("Login error"));
}
} on Exception catch (error) {
return Result.error(error);
Original file line number Diff line number Diff line change
@@ -32,7 +32,7 @@ class SharedPreferencesService {
_log.finer('Replaced token');
await sharedPreferences.setString(_tokenKey, token);
}
return Result.ok(null);
return const Result.ok(null);
} on Exception catch (e) {
_log.warning('Failed to set token', e);
return Result.error(e);
Original file line number Diff line number Diff line change
@@ -98,7 +98,7 @@ class BookingCreateUseCase {
case Ok<List<Destination>>():
final destination = result.value
.firstWhere((destination) => destination.ref == destinationRef);
return Ok(destination);
return Result.ok(destination);
case Error<List<Destination>>():
return Result.error(result.error);
}
Original file line number Diff line number Diff line change
@@ -37,7 +37,7 @@ class BookingShareUseCase {
try {
await _share(text);
_log.fine('Shared booking');
return Result.ok(null);
return const Result.ok(null);
} on Exception catch (error) {
_log.severe('Failed to share booking', error);
return Result.error(error);
Original file line number Diff line number Diff line change
@@ -61,7 +61,7 @@ class BookingViewModel extends ChangeNotifier {
_log.fine('Created Booking');
_booking = result.value;
notifyListeners();
return Result.ok(null);
return const Result.ok(null);
case Error<Booking>():
_log.warning('Booking error: ${result.error}');
notifyListeners();
12 changes: 6 additions & 6 deletions compass_app/app/lib/utils/result.dart
Original file line number Diff line number Diff line change
@@ -18,11 +18,11 @@
sealed class Result<T> {
const Result();

/// Creates an instance of Result containing a value
factory Result.ok(T value) => Ok(value);
/// Creates a successful [Result], completed with the specified [value].
const factory Result.ok(T value) = Ok._;

/// Create an instance of Result containing an error
factory Result.error(Exception error) => Error(error);
/// Creates an error [Result], completed with the specified [error].
const factory Result.error(Exception error) = Error._;

/// Convenience method to cast to Ok
Ok<T> get asOk => this as Ok<T>;
@@ -33,7 +33,7 @@ sealed class Result<T> {

/// Subclass of Result for values
final class Ok<T> extends Result<T> {
const Ok(this.value);
const Ok._(this.value);

/// Returned value in result
final T value;
@@ -44,7 +44,7 @@ final class Ok<T> extends Result<T> {

/// Subclass of Result for errors
final class Error<T> extends Result<T> {
const Error(this.error);
const Error._(this.error);

/// Returned error in result
final Exception error;
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ class FakeAuthApiClient implements AuthApiClient {
@override
Future<Result<LoginResponse>> login(LoginRequest loginRequest) async {
if (loginRequest.email == 'EMAIL' && loginRequest.password == 'PASSWORD') {
return Result.ok(const LoginResponse(token: 'TOKEN', userId: '123'));
return const Result.ok(LoginResponse(token: 'TOKEN', userId: '123'));
}
return Result.error(Exception('ERROR!'));
}
Loading