SwissArmyKnife logoSwissArmyKnife

Cookbook

Common SwissArmyKnife patterns for day-to-day Dart application code.

Parse Safely#

final port = Result.runCatching(() => int.parse('8080'))
    .map((value) => value.clamp(1, 65535))
    .getOrElse(3000);

Validate Input#

final validator = Validator<String>.email().minLength(5);
final result = validator.validate('team@example.com');

if (result.isFailure) {
  print(result.errorOrNull);
}

Read JSON#

final payload = {
  'user': {'profile': {'name': 'Ada'}},
};

final name = payload.at('user.profile.name').asStringOr('Unknown');

Retry Work#

final result = await retry(
  () async => fetchSomething(),
  maxAttempts: 3,
  delay: const Duration(milliseconds: 200),
  backoff: BackoffStrategy.exponential,
);

Bound Concurrency#

final queue = TaskQueue(concurrency: 4);
final futures = ids.map((id) => queue.add(() => loadRecord(id)).future);
final records = await Future.wait(futures);

Compose Middleware#

final pipeline = MiddlewarePipeline<int>()
    .use(MiddlewarePipeline.tap((value) => print('in: $value')))
    .use(MiddlewarePipeline.transform((value) => value + 1));

final output = await pipeline.run(41);