doRun method

  1. @override
Future<int> doRun()
override

Implementation

@override
Future<int> doRun() async {
  final config = findConfigAndSetWorkingDir();
  final checkConfig = config.code.check;
  final args = argResults!;
  final isJson = args.isJsonFormat();

  final analyzeOnly = args[_argAnalyzeOnly] as bool;
  final testOnly = args[_argTestOnly] as bool;

  if (analyzeOnly && testOnly) {
    return error(2,
        message: 'You can not use --$_argAnalyzeOnly '
            'and --$_argTestOnly together.');
  }

  final needAnalyze = !testOnly;
  final needTest = !analyzeOnly;
  final needBuild = (args[_argBuild] as bool) && !analyzeOnly && !testOnly;
  final failFast = args[_argFailFast] as bool;

  _filter = OutputFilter(extraPatterns: checkConfig.noise);
  _isFlutterProject = await _checkIsFlutterProject();
  printVerbose('Project type: ${_isFlutterProject ? 'flutter' : 'dart'}');

  final gates = <CheckGateResult>[];

  Future<void> runGate(
    CheckGate gate,
    Future<CheckGateResult> Function() run, {
    required bool need,
    String skipReason = 'skipped',
  }) async {
    if (!need || (failFast && gates.any((g) => g.isFailed))) {
      gates.add(CheckGateResult.skipped(gate, summary: skipReason));
      return;
    }

    printInfo('Running ${gate.key}...');
    final result = await run();
    if (!isJson) _printGate(result);
    gates.add(result);
  }

  await runGate(CheckGate.analyze, _runAnalyze, need: needAnalyze);
  await runGate(CheckGate.test, _runTest, need: needTest);
  await runGate(
    CheckGate.build,
    () => _runBuild(
      args[_argBuildTarget] as String? ?? _defaultBuildTarget(checkConfig),
    ),
    need: needBuild,
  );

  final report = CheckReport(gates: gates);

  if (isJson) {
    return jsonResult(
      exitCode: report.exitCode,
      summary: report.summary,
      data: report.toJson(),
    );
  } else {
    printInfo('');
    printInfo('=== alex code check: ${report.ok ? 'PASS' : 'FAIL'} ===');
    printInfo(report.summary);
  }

  return report.exitCode;
}