run method

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

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 initialProjectName =
      argResults?.rest.isNotEmpty == true ? argResults!.rest.first : null;
  final initialOrg = argResults?['org'] as String?;
  final configPath = argResults?['config'] as String?;

  try {
    ProjectConfig config;

    if (configPath != null) {
      final configService = YamlConfigService();
      await configService.load(configPath);

      // Root key is expected to be 'project'
      final projectMap =
          configService.getValue<Map<String, dynamic>>('project');

      if (projectMap != null) {
        if (initialProjectName != null) {
          projectMap['name'] = initialProjectName;
        }
        if (initialOrg != null) {
          projectMap['org'] = initialOrg;
        }
        config = ProjectConfig.fromYamlMap(projectMap);
        logger.success('Loaded configuration from $configPath');
      } else {
        logger.error('Invalid config file: missing "project" root key.');
        return 1;
      }
    } else {
      final wizard = locator<ProjectWizard>();
      config = await wizard.runWizard(
        initialProjectName: initialProjectName,
        initialOrg: initialOrg,
      );
    }

    final generator = locator<ProjectGenerator>();

    final targetPath = p.join(Directory.current.path, config.projectName);

    await generator.generate(config, targetPath);
    return 0;
  } catch (e, stack) {
    logger.error('Failed to create project.', e, stack);
    return 1;
  }
}