run<T> method

Future<T> run<T>({
  1. required RecordedRequest describe(),
  2. required Future<T> live(),
  3. T decode(
    1. Object? recorded
    )?,
  4. ReplayMissBehavior onMiss = ReplayMissBehavior.forward,
  5. Object reject(
    1. String message
    ) = StateError.new,
})

Serves one call/return request through the recorder.

describe is invoked only when the recorder's mode needs it. On ForwardToSource, live runs and its result is recorded (only while recording) and returned. On Replayed, the recorded response is passed through decode (identity cast by default). On RejectRequest, reject turns the recorder's message into the error to throw — a StateError by default.

Implementation

Future<T> run<T>({
  required RecordedRequest Function() describe,
  required Future<T> Function() live,
  T Function(Object? recorded)? decode,
  ReplayMissBehavior onMiss = ReplayMissBehavior.forward,
  Object Function(String message) reject = StateError.new,
}) async {
  switch (decide(describe, onMiss: onMiss)) {
    case Replayed(:final interaction):
      final recorded = interaction.response;
      return decode == null ? recorded as T : decode(recorded);
    case RejectRequest(:final message):
      throw reject(message);
    case ForwardToSource():
      final result = await live();
      record(() => RecordedInteraction(
            request: describe(),
            response: result,
            recordedAt: DateTime.now(),
          ));
      return result;
  }
}