run method
Runs this command.
The return value is wrapped in a Future if necessary and returned by
CommandRunner.runCommand.
Implementation
@override
Future<int> run() async {
final results = argResults!;
final rest = results.rest;
if (results['verbose'] as bool) {
Logger.verbose = true;
}
if (rest.isEmpty) {
Logger.error('Project name is required.');
Logger.plain('');
Logger.plain('Usage: $invocation');
Logger.plain('');
Logger.plain('Examples:');
Logger.plain(' srik create my_app');
Logger.plain(' srik create my_app --arch=mvvm --design=vibrant');
Logger.plain(' srik create my_app --arch=clean --gradient '
'--spacing=spacious --brand=#FF5733');
return 64;
}
final projectName = rest.first;
final nameError = Validators.projectName(projectName);
if (nameError != null) {
Logger.error(nameError);
return 64;
}
final brand = results['brand'] as String;
final brandError = Validators.hexColor(brand);
if (brandError != null) {
Logger.error('Invalid --brand value: $brandError');
return 64;
}
final org = results['org'] as String;
final orgError = Validators.organization(org);
if (orgError != null) {
Logger.error('Invalid --org value: $orgError');
return 64;
}
final output = results['output'] as String;
final outputError = _validateOutputDir(output);
if (outputError != null) {
Logger.error(outputError);
return 64;
}
final interactive = results['interactive'] as bool && stdin.hasTerminal;
Logger.header('Creating Flutter project: $projectName');
Logger.plain('');
final config = ProjectPrompts.collect(
projectName: projectName,
providedDescription: results['description'] as String?,
providedOrg: org,
providedBrand: brand,
providedArch: results['arch'] as String?,
providedDesign: results['design'] as String?,
providedGradient: results['gradient'] as bool?,
providedSpacing: results['spacing'] as String?,
outputDirectory: output,
interactive: interactive,
);
Logger.plain('');
Logger.dim('Architecture: ${config.architecture.label}');
Logger.dim('Design preset: ${config.designPreset.id}');
Logger.dim('Gradient: ${config.useGradient ? 'yes' : 'no'}');
Logger.dim('Spacing: ${config.spacingScale.id}');
Logger.dim('Brand color: ${config.brandColor}');
Logger.dim('Output: ${p.absolute(config.outputDirectory)}');
Logger.plain('');
try {
await ProjectGenerator().generate(config);
} on StateError catch (e) {
Logger.error(e.message);
return 1;
} on FormatException catch (e) {
Logger.error(e.message);
return 64;
} catch (e) {
Logger.error('Generation failed: $e');
return 1;
}
Logger.plain('');
Logger.success('Project ready: ${config.projectPath}');
Logger.plain('');
Logger.plain('Next steps:');
Logger.plain(' cd ${config.projectName}');
Logger.plain(' flutter run');
Logger.plain('');
return 0;
}