Skip to content

Commit

Permalink
feat: migrate to rust 2
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmah309 committed Nov 18, 2024
1 parent e7f462b commit 3e4113b
Show file tree
Hide file tree
Showing 10 changed files with 39 additions and 239 deletions.
18 changes: 5 additions & 13 deletions lib/anyhow.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,9 @@
/// Anyhow implementation on top of the 'rust_core' Result type.
library anyhow;

export 'base.dart'
hide
guard,
guardAsync,
guardAsyncResult,
guardResult,
Result,
Ok,
Err,
FutureResult,
ToOkExtension,
ToErrExtension;
export 'src/anyhow/anyhow_error.dart';
export 'src/anyhow/execute_protected.dart';

export 'package:rust/src/result/result.dart' show Ok, Err;
export 'package:rust/src/result/guard.dart';
export 'package:rust/src/result/record_to_result_extensions.dart';
export 'package:rust/src/result/result_extensions.dart';
6 changes: 0 additions & 6 deletions lib/base.dart

This file was deleted.

3 changes: 2 additions & 1 deletion lib/src/anyhow/anyhow_error.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:anyhow/base.dart' as base;
import 'package:rust/rust.dart' as rust;
import 'package:rust/rust.dart';

part 'anyhow_extensions.dart';
part 'anyhow_result.dart';
Expand Down
74 changes: 10 additions & 64 deletions lib/src/anyhow/anyhow_extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ extension AnyhowResultExtensions<S> on Result<S> {
assert(context is! Error, _isAlreadyErrorAssertionMessage);
if (Error.hasStackTrace) {
return Err(Error._withStackTrace(context, StackTrace.current,
parent: (this as Err).err));
parent: unwrapErr()));
}
return Err(Error(context, parent: (this as Err).err));
return Err(Error(context, parent: unwrapErr()));
}

/// If [Result] is [Ok] returns this. Otherwise, Lazily calls the function and returns an [Err] with the additional
Expand All @@ -30,30 +30,30 @@ extension AnyhowResultExtensions<S> on Result<S> {
assert(context is! Error, _isAlreadyErrorAssertionMessage);
if (Error.hasStackTrace) {
return Err(Error._withStackTrace(context, StackTrace.current,
parent: (this as Err).err));
parent: unwrapErr()));
}
return Err(Error(context, parent: (this as Err).err));
return Err(Error(context, parent: unwrapErr()));
}

/// Overrides the base Extension.
Result<S> toAnyhowResult() => this;
}

extension AnyhowOkExtensions<S> on Ok<S> {
extension AnyhowOkExtensions<S> on Ok<S, Error> {
/// returns this
Ok<S> context(Object context) {
Ok<S, Error> context(Object context) {
return this;
}

/// returns this
Ok<S> withContext(Object Function() fn) {
Ok<S, Error> withContext(Object Function() fn) {
return this;
}
}

extension AnyhowErrExtensions<S> on Err<S> {
extension AnyhowErrExtensions<S> on Err<S, Error> {
/// Returns an [Error] with the additional context. The context should not be an instance of [Error].
Err<S> context(Object context) {
Err<S, Error> context(Object context) {
assert(context is! Error, _isAlreadyErrorAssertionMessage);
if (Error.hasStackTrace) {
return Err(
Expand All @@ -64,7 +64,7 @@ extension AnyhowErrExtensions<S> on Err<S> {

/// Lazily calls the function if the [Result] is an [Err] and returns an [Error] with the additional context.
/// The context should not be an instance of [Error].
Err<S> withContext(Object Function() fn) {
Err<S, Error> withContext(Object Function() fn) {
final context = fn();
assert(context is! Error, _isAlreadyErrorAssertionMessage);
if (Error.hasStackTrace) {
Expand Down Expand Up @@ -139,57 +139,3 @@ extension AnyhowFutureIterableResultExtensions<S>
return then((result) => result.merge());
}
}

/// Adds methods for converting any object
/// into a [Result] type ([Ok] or [Err]).
extension ToOkExtension<S> on S {
/// Convert the object to a [Result] type [Ok].
Ok<S> toOk() {
assert(this is! Result,
'Don\'t use the "toOk()" method on instances of Result.');
return Ok(this);
}
}

extension ToErrExtension<E extends Object> on E {
/// Convert the object to a [Result] type [Err].
Err<S> toErr<S>() {
assert(this is! Result,
'Don\'t use the "toErr()" method on instances of Result.');
return Err(Error(this));
}
}

extension ToErrForErrorExtension<E extends Error> on E {
/// Convert the error to a [Result] type [Err].
Err<S> toErr<S>() {
return Err(this);
}
}

extension BaseResultExtension<S, F extends Object> on base.Result<S, F> {
/// When this Result is a base [base.Result] and not already an "anyhow" [Result], converts to anyhow [Result].
/// Otherwise returns this.
Result<S> toAnyhowResult() {
if (isOk()) {
return Ok((this as base.Ok<S, F>).unwrap());
}
return bail((this as base.Err<S, F>).unwrapErr());
}
}

extension BaseOkExtension<S, F extends Object> on base.Ok<S, F> {
/// When this Result is a base [base.Result] and not already an "anyhow" [Result], converts to anyhow [Result].
/// Otherwise returns this.
Result<S> toAnyhowResult() {
return Ok(unwrap());
}
}

extension BaseErrExtension<S, F extends Object> on base.Err<S, F> {
/// When this Result is a base [base.Result] and not already an "anyhow" [Result], converts to anyhow [Result].
/// Otherwise returns this.
Result<S> toAnyhowResult() {
return bail(unwrapErr());
}
}
20 changes: 1 addition & 19 deletions lib/src/anyhow/anyhow_result.dart
Original file line number Diff line number Diff line change
@@ -1,25 +1,7 @@
part of 'anyhow_error.dart';

/// {@macro result}
typedef BaseResult<S, F extends Object> = base.Result<S, F>;

/// {@macro ok}
typedef BaseOk<S, F extends Object> = base.Ok<S, F>;

/// {@macro err}
typedef BaseErr<S, F extends Object> = base.Err<S, F>;

/// {@macro futureResult}
typedef BaseFutureResult<S, F extends Object> = base.FutureResult<S, F>;

/// {@macro futureResult}
typedef FutureResult<S> = Future<Result<S>>;

/// {@macro result}
typedef Result<S> = BaseResult<S, Error>;

/// {@macro ok}
typedef Ok<S> = BaseOk<S, Error>;

/// {@macro err}
typedef Err<S> = BaseErr<S, Error>;
typedef Result<S> = rust.Result<S, Error>;
59 changes: 0 additions & 59 deletions lib/src/anyhow/execute_protected.dart

This file was deleted.

2 changes: 1 addition & 1 deletion lib/src/anyhow/functions.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
part of 'anyhow_error.dart';

/// Convenience function for turning an object into an anyhow [Err] Result.
Err<S> bail<S>(Object err) {
Err<S, Error> bail<S>(Object err) {
assert(err is! Error, _isAlreadyErrorAssertionMessage);
if (Error.hasStackTrace) {
return Err(Error._withStackTrace(err, StackTrace.current));
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ environment:
sdk: ">=3.3.0 <4.0.0"

dependencies:
rust: ^1.0.0
rust: ^2.0.0-dev1

dev_dependencies:
lints: ^3.0.0
Expand Down
52 changes: 0 additions & 52 deletions test/src/anyhow_result_extensions_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,58 +20,6 @@ void main() {
transposed = result.transposeOut();
expect(transposed!.unwrapErr().downcast<String>().unwrap(), "");
});

group('toErr', () {
test('without result type', () {
final result = 'error'.toErr();

expect(result, isA<Result<dynamic>>());
expect(result.unwrapErr().downcast<String>().unwrap(), isA<String>());
expect(result.unwrapErr().downcast<String>().unwrap(), 'error');
});

test('with result type', () {
final Result<int> result = 'error'.toErr();

expect(result, isA<Result<int>>());
expect(result.unwrapErr().downcast<String>().unwrap(), isA<String>());
expect(result.unwrapErr().downcast<String>().unwrap(), 'error');
});

test('already an Error', () {
final Result<int> result = Error('error').toErr();

expect(result, isA<Result<int>>());
expect(result.unwrapErr().downcast<String>().unwrap(), isA<String>());
expect(result.unwrapErr().downcast<String>().unwrap(), 'error');
});

test('throw AssertException if is a Result object', () {
final Result<int> result = 'error'.toErr();
expect(result.toErr, throwsA(isA<AssertionError>()));
});
});

group('toOk', () {
test('without result type', () {
final result = 'ok'.toOk();

expect(result, isA<Result<String>>());
expect(result.unwrapOrNull(), 'ok');
});

test('with result type', () {
final Result<String> result = 'ok'.toOk();

expect(result, isA<Result<String>>());
expect(result.unwrapOrNull(), 'ok');
});

test('throw AssertException if is a Result object', () {
final result = 'ok'.toOk();
expect(result.toOk, throwsA(isA<AssertionError>()));
});
});
}

class X extends Error {
Expand Down
Loading

0 comments on commit 3e4113b

Please sign in to comment.