run method

void run(
  1. List<String> arguments, {
  2. String? workingDirectory,
})

Implementation

void run(List<String> arguments, {String? workingDirectory}) async {
  final parser = ArgParser()
    ..addOption('package',
        abbr: 'p', help: 'Package name', defaultsTo: 'twafok')
    ..addFlag('help', abbr: 'h', help: 'Show help', negatable: false);

  try {
    final results = parser.parse(arguments);

    if (results['help'] == true) {
      _printHelp();
      return;
    }

    final args = results.rest;
    final workDir = workingDirectory ?? Directory.current.path;
    final packageName = results['package'] as String;

    // Get feature path
    String featurePath;
    if (args.isNotEmpty) {
      featurePath = args[0];
    } else {
      // Auto-detect current feature
      final autoPath = await _findFeaturePath(workDir);
      if (autoPath != null) {
        featurePath = autoPath;
        print(' 📍 Auto-detected feature path: $featurePath');
      } else {
        print(' ❌ Feature path is required');
        print(' 👉 Example: twafok generate_di lib/features/Profile');
        exit(1);
      }
    }

    final absoluteFeaturePath = path.isAbsolute(featurePath)
        ? featurePath
        : path.join(workDir, featurePath);

    // Check if path exists
    if (!await Directory(absoluteFeaturePath).exists()) {
      print(' ❌ Path does not exist: $absoluteFeaturePath');
      exit(1);
    }

    final rawName = path.basename(absoluteFeaturePath);
    final featureName = _toSnakeCase(rawName);
    final diFile = path.join(absoluteFeaturePath, '${featureName}_di.dart');

    print('');
    print(' 🔧 Generating DI file: ${path.basename(diFile)}');
    print(' ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');

    // Collect all classes
    final useCaseClasses = <String>[];
    final cubitClasses = <String>[];
    final dataSourceClasses = <String>[];
    final repoClasses = <String>[];

    await _collectClasses(absoluteFeaturePath, useCaseClasses, cubitClasses,
        dataSourceClasses, repoClasses);

    // Generate DI file
    await _generateDiFile(diFile, absoluteFeaturePath, featureName, packageName,
        useCaseClasses, cubitClasses, dataSourceClasses,
        repoClasses, rawName);

    print('');
    print(' ✅ DI generation completed!');

  } catch (e) {
    print(' ❌ Error: $e');
    exit(1);
  }
}