run method

  1. @override
FutureOr<void> run()
override

Runs this command.

The return value is wrapped in a Future if necessary and returned by CommandRunner.runCommand.

Implementation

@override
FutureOr<void> run() {
  print("digraph packages {");
  print('  size="10"; ratio=fill;');

  for (final package in packages) {
    print(
      '  ${package.name} [shape="box"; color="${getColor(package.name)}"];',
    );
  }

  for (final package in packages) {
    package.pubspec.allDependencies.keys
        .where((dep) => packages.any((package) => package.name == dep))
        .forEach((dep) {
      final attrs = package.pubspec.dependencies.containsKey(dep)
          ? 'style="filled"; color="${getColor(dep)}"'
          : 'style="dashed"; color="${getColor(dep)}"';
      print("  ${package.name} -> $dep [$attrs];");
    });
  }

  final groupedPackages =
      packages.fold<Map<String, List<Package>>>({}, (grouped, package) {
    if (!grouped.containsKey(package.namespace)) {
      grouped[package.namespace] = [];
    }

    grouped[package.namespace]!.add(package);

    return grouped;
  });

  groupedPackages.forEach((namespace, packagesInGroup) {
    print('  subgraph "cluster $namespace" {');
    print('    label="$namespace";');
    print('    color="${getColor(namespace)}";');
    for (final package in packagesInGroup) {
      print("    ${package.name};");
    }
    print("  }");
  });

  print("}");
}