blob: 5a1f54c4216aed5ef7369f76984ce520791e294a [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:process/process.dart';
import '../base/file_system.dart';
import '../base/logger.dart';
import '../project.dart';
import '../project_validator.dart';
import '../project_validator_result.dart';
import '../runner/flutter_command.dart';
class ValidateProject {
ValidateProject({
required this.fileSystem,
required this.logger,
required this.allProjectValidators,
required this.userPath,
required this.processManager,
this.verbose = false,
this.machine = false,
});
final FileSystem fileSystem;
final Logger logger;
final bool verbose;
final bool machine;
final String userPath;
final List<ProjectValidator> allProjectValidators;
final ProcessManager processManager;
Future<FlutterCommandResult> run() async {
final Directory workingDirectory = userPath.isEmpty ? fileSystem.currentDirectory : fileSystem.directory(userPath);
final FlutterProject project = FlutterProject.fromDirectory(workingDirectory);
final Map<ProjectValidator, Future<List<ProjectValidatorResult>>> results = <ProjectValidator, Future<List<ProjectValidatorResult>>>{};
bool hasCrash = false;
for (final ProjectValidator validator in allProjectValidators) {
if (validator.machineOutput != machine) {
continue;
}
if (!results.containsKey(validator) && validator.supportsProject(project)) {
results[validator] = validator.start(project).catchError((Object exception, StackTrace trace) {
hasCrash = true;
return <ProjectValidatorResult>[ProjectValidatorResult.crash(exception, trace)];
});
}
}
final StringBuffer buffer = StringBuffer();
if (machine) {
// Print properties
buffer.write('{\n');
for (final Future<List<ProjectValidatorResult>> resultListFuture in results.values) {
final List<ProjectValidatorResult> resultList = await resultListFuture;
int count = 0;
for (final ProjectValidatorResult result in resultList) {
count++;
buffer.write(' "${result.name}": ${result.value}${count < resultList.length ? ',' : ''}\n');
}
}
buffer.write('}');
logger.printStatus(buffer.toString());
} else {
final List<String> resultsString = <String>[];
for (final ProjectValidator validator in results.keys) {
if (results[validator] != null) {
resultsString.add(validator.title);
addResultString(validator.title, await results[validator], resultsString);
}
}
buffer.writeAll(resultsString, '\n');
logger.printBox(buffer.toString());
}
if (hasCrash) {
return const FlutterCommandResult(ExitStatus.fail);
}
return const FlutterCommandResult(ExitStatus.success);
}
void addResultString(final String title, final List<ProjectValidatorResult>? results, final List<String> resultsString) {
if (results != null) {
for (final ProjectValidatorResult result in results) {
resultsString.add(getStringResult(result));
}
}
}
String getStringResult(ProjectValidatorResult result) {
final String icon;
switch(result.status) {
case StatusProjectValidator.error:
icon = '[✗]';
break;
case StatusProjectValidator.info:
case StatusProjectValidator.success:
icon = '[✓]';
break;
case StatusProjectValidator.warning:
icon = '[!]';
break;
case StatusProjectValidator.crash:
icon = '[☠]';
break;
}
return '$icon $result';
}
}