parseUseCaseInfo static method
Future<ParsedUseCaseInfo>
parseUseCaseInfo(
- String u,
- GeneratorConfig config,
- String outputDir, {
- DiscoveryEngine? discovery,
- 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,
);
}