import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:process/process.dart';
import 'base/common.dart';
import 'base/logger.dart';
class FlutterToolsEnvironment {
FlutterToolsEnvironment({
required Map<String, Object?> mapping,
}) : _mapping = mapping;
static Future<FlutterToolsEnvironment> initializeFlutterToolsEnvironment(
ProcessManager processManager, Logger logger) async {
final ProcessResult result = await processManager
.run(<String>['flutter', 'analyze', '--suggestions', '--machine']);
if (result.exitCode != 0) {
if ((result.stderr as String).contains(
'The "--machine" flag is only valid with the "--version" flag.')) {
logger.printError(
'The migrate tool is only compatible with flutter tools 3.4.0 or newer (git hash: 21861423f25ad03c2fdb33854b53f195bc117cb3).');
}
throwToolExit(
'Flutter tool exited while running `flutter analyze --suggestions --machine` with: ${result.stderr}');
}
String commandOutput = (result.stdout as String).trim();
Map<String, Object?> mapping = <String, Object?>{};
if (commandOutput.contains(RegExp(r'[\s\S]*{[\s\S]+}[\s\S]*'))) {
commandOutput = commandOutput.substring(commandOutput.indexOf('{'));
mapping = jsonDecode(commandOutput.replaceAll(r'\', r'\\'))
as Map<String, Object?>;
}
return FlutterToolsEnvironment(mapping: mapping);
}
final Map<String, Object?> _mapping;
Object? operator [](String key) {
if (_mapping.containsKey(key)) {
return _mapping[key];
}
return null;
}
String? getString(String key) {
final Object? value = _mapping[key];
return value is String? ? value : null;
}
bool? getBool(String key) {
final Object? value = _mapping[key];
return value is bool? ? value : null;
}
bool containsKey(String key) {
return _mapping.containsKey(key);
}
}