run method

void run(
  1. String name
)

Runs the command to generate a feature with the given name.

Implementation

void run(String name) {
  if (!Utils.isInitialized()) {
    print('⚠️ Project not initialized. Initializing with core layers...');
    GenerateInitCommand().run();
  }

  final featureSnake = Utils.snake(name);
  final featurePascal = Utils.pascal(name);
  final basePath = 'lib/features/$featureSnake';

  Utils.addDependencies();

  // Prompt for Cubit or Bloc
  print('Choose state management:');
  print('1. Cubit (Default)');
  print('2. Bloc');
  stdout.write('Enter choice (1 or 2): ');
  final choice = stdin.readLineSync()?.trim();
  final isBloc = choice == '2';
  final stateManagement = isBloc ? 'bloc' : 'cubit';

  // DI
  Utils.createDir('$basePath/di');
  Utils.createFile(
    '$basePath/di/${featureSnake}_di.dart',
    DiTemplate.diTemplate(featureSnake, isBloc: isBloc),
  );

  // Presentation Layer
  Utils.createDir('$basePath/presentation/$stateManagement');
  Utils.createDir('$basePath/presentation/pages');
  Utils.createDir('$basePath/presentation/widgets');

  if (isBloc) {
    Utils.createFile(
      '$basePath/presentation/bloc/${featureSnake}_bloc.dart',
      BlocTemplate.blocTemplate(featureSnake),
    );
    Utils.createFile(
      '$basePath/presentation/bloc/${featureSnake}_event.dart',
      EventTemplate.eventTemplate(featureSnake),
    );
    Utils.createFile(
      '$basePath/presentation/bloc/${featureSnake}_state.dart',
      StateTemplate.stateTemplate(featureSnake),
    );
  } else {
    Utils.createFile(
      '$basePath/presentation/cubit/${featureSnake}_cubit.dart',
      CubitTemplate.cubitTemplate(featureSnake),
    );
    Utils.createFile(
      '$basePath/presentation/cubit/${featureSnake}_state.dart',
      StateTemplate.stateTemplate(featureSnake),
    );
  }

  Utils.createFile(
    '$basePath/presentation/pages/${featureSnake}_page.dart',
    PageTemplate.pageTemplate(featureSnake, isBloc: isBloc),
  );

  Utils.createFile(
    '$basePath/presentation/pages/${featureSnake}_view.dart',
    ViewTemplate.viewTemplate(featureSnake, isBloc: isBloc),
  );

  // Domain Layer
  Utils.createDir('$basePath/domain/entities');
  Utils.createDir('$basePath/domain/repositories');
  Utils.createDir('$basePath/domain/usecases');

  Utils.createFile(
    '$basePath/domain/entities/${featureSnake}_entity.dart',
    EntityTemplate.entityTemplate(featureSnake),
  );

  Utils.createFile(
    '$basePath/domain/repositories/${featureSnake}_repository.dart',
    RepositoryTemplate.repositoryTemplate(featureSnake),
  );

  Utils.createFile(
    '$basePath/domain/usecases/get_${featureSnake}_usecase.dart',
    UsecaseTemplate.usecaseTemplate('get_$featureSnake', featureSnake),
  );

  // Data Layer
  Utils.createDir('$basePath/data/datasources');
  Utils.createDir('$basePath/data/models');
  Utils.createDir('$basePath/data/repositories');

  Utils.createFile(
    '$basePath/data/datasources/${featureSnake}_remote_datasource.dart',
    DatasourceTemplate.datasourceTemplate(featureSnake),
  );

  Utils.createFile(
    '$basePath/data/models/${featureSnake}_model.dart',
    ModelTemplate.modelTemplate(featureSnake),
  );

  Utils.createFile(
    '$basePath/data/repositories/${featureSnake}_repository_impl.dart',
    RepositoryImplTemplate.repositoryImplTemplate(featureSnake),
  );

  _registerFeatureInMainDi(featureSnake, featurePascal);

  print(
    'Feature "$featurePascal" with Clean Architecture generated successfully',
  );
}