renderPlaybookList function

void renderPlaybookList(
  1. LiveBlock block,
  2. String device,
  3. Object? payload, {
  4. List<String> registered = const [],
  5. String restart = 'restart',
  6. String play = 'playbook',
})

Adds the playbooks in a playbooks.list payload to block.

Playbooks in registered (from lib/bootstrap/playbooks.dart) that the app didn't list were usually added after it started, so block ends by saying to hot restart with restart. play is how to play one from where the list was shown.

Implementation

void renderPlaybookList(
  LiveBlock block,
  String device,
  Object? payload, {
  List<String> registered = const [],
  String restart = 'restart',
  String play = 'playbook',
}) {
  final Object? list = payload is Map ? payload['playbooks'] : null;
  final List<Map<Object?, Object?>> playbooks = [
    if (list is List)
      for (final Object? playbook in list)
        if (playbook is Map) playbook,
  ];
  final List<String> notLoaded = _notLoaded(registered, [
    for (final Map<Object?, Object?> playbook in playbooks)
      '${playbook['name']}',
  ]);
  if (playbooks.isEmpty) {
    if (notLoaded.isEmpty) {
      block.note(
        'This app has no playbooks yet. Create one with: '
        'metro make:playbook sign_up_to_dashboard',
      );
    }
    _warnNotLoaded(block, notLoaded, restart);
    return;
  }
  block.heading('Playbooks on $device:');
  block.table(
    ['NAME', 'DESCRIPTION', 'SPEED', 'STEPS'],
    [
      for (final Map<Object?, Object?> playbook in playbooks)
        [
          '${playbook['name']}',
          '${playbook['description'] ?? ''}',
          '${playbook['speed'] ?? ''}',
          switch (playbook['steps']) {
            final List steps => '${steps.length}',
            _ => '?',
          },
        ],
    ],
  );
  final Object? running = payload is Map ? payload['running'] : null;
  if (running != null) block.note('Playing now ($running)');
  block.note('Play one with $play <name>, and add --speed fast to hurry it');
  _warnNotLoaded(block, notLoaded, restart);
}