parseUseCaseInfo static method

Future<ParsedUseCaseInfo> parseUseCaseInfo(
  1. String u,
  2. GeneratorConfig config,
  3. String outputDir, {
  4. DiscoveryEngine? discovery,
  5. FileSystem? fileSystem,
})

Implementation

static Future<ParsedUseCaseInfo> parseUseCaseInfo(
  String u,
  GeneratorConfig config,
  String outputDir, {
  DiscoveryEngine? discovery,
  FileSystem? fileSystem,
}) async {
  final fs = fileSystem ?? FileSystem.create(root: outputDir);
  final className = u.endsWith('UseCase') ? u : '${u}UseCase';
  final fieldName = StringUtils.pascalToCamel(
    className.replaceAll('UseCase', ''),
  );
  final usecaseSnake = StringUtils.camelToSnake(
    className.replaceAll('UseCase', ''),
  );

  // Try to find the file and parse params/returns
  String? paramsType = config.paramsType;
  String? returnsType = config.returnsType;
  String? useCaseType = config.useCaseType;

  final usecaseDomain = await findUseCaseDomain(
    usecaseSnake,
    config.effectiveDomain,
    outputDir,
    discovery: discovery,
    fileSystem: fs,
  );

  final filePath = path.join(
    outputDir,
    'domain',
    'usecases',
    usecaseDomain,
    '${usecaseSnake}_usecase.dart',
  );

  // Final check for existence
  if (await fs.exists(filePath)) {
    final content = await fs.read(filePath);
    final extendsMatch = RegExp(
      r'extends (UseCase|StreamUseCase|CompletableUseCase|SyncUseCase)<(.+)>',
    ).firstMatch(content);
    if (extendsMatch != null) {
      useCaseType = extendsMatch.group(1)?.toLowerCase();
      final typesStr = extendsMatch.group(2);
      if (typesStr != null) {
        final types = _splitByComma(typesStr);
        if (useCaseType == 'completableusecase') {
          useCaseType = 'completable';
          paramsType = types[0];
          returnsType = 'void';
        } else if (types.isNotEmpty) {
          returnsType = types[0];
          paramsType = types.length > 1 ? types[1] : 'NoParams';
          if (useCaseType == 'streamusecase') useCaseType = 'stream';
          if (useCaseType == 'syncusecase') useCaseType = 'sync';
          if (useCaseType == 'usecase') useCaseType = 'future';
        }
      }
    }
  } else {
    // If file not found, try to infer from name if it's a standard pattern
    // and we are in a feature context
    if (usecaseSnake.startsWith('get_') &&
        usecaseSnake.endsWith(StringUtils.camelToSnake(config.name))) {
      returnsType ??= config.name;
      paramsType ??= 'NoParams';
    } else if (usecaseSnake.startsWith('list_') &&
        usecaseSnake.endsWith(StringUtils.camelToSnake(config.name))) {
      returnsType ??= 'List<${config.name}>';
      paramsType ??= 'NoParams';
    }
  }

  return ParsedUseCaseInfo(
    className: className,
    fieldName: fieldName,
    paramsType: paramsType,
    returnsType: returnsType,
    useCaseType: useCaseType,
  );
}