handle method
Called automatically before executing the command. You can override to do pre-validation or setup.
Implementation
@override
Future<void> handle(List<String> args) async {
final input = argResults?['name'] as String?;
if (input == null || input.trim().isEmpty) {
logger.error('❌ Usage: khadem make:observer --name=User --model=User');
exitCode = 1;
return;
}
final parts = CliNaming.splitFolderAndName(input);
final folder = parts.folder;
final rawObserverName = parts.name;
final observerClassName = CliNaming.ensureSuffix(
CliNaming.toPascalCase(rawObserverName),
'Observer',
);
final observerBase = observerClassName.replaceAll('Observer', '');
final modelArg = argResults?['model'] as String?;
final modelBase = (modelArg == null || modelArg.trim().isEmpty)
? observerBase
: CliNaming.toPascalCase(modelArg.trim());
final modelClassName = CliNaming.toPascalCase(modelBase);
final modelFileName = '${CliNaming.toSnakeCase(modelClassName)}.dart';
final fileName = '${CliNaming.toSnakeCase(observerBase)}_observer.dart';
final relativePath = folder.isEmpty
? 'lib/app/observers/$fileName'
: 'lib/app/observers/$folder/$fileName';
final file = File(relativePath);
if (await file.exists()) {
logger.error('❌ Observer "$fileName" already exists at "$relativePath"');
exitCode = 1;
return;
}
final modelImport = _buildModelImportPath(
folder: folder,
modelFileName: modelFileName,
);
await file.create(recursive: true);
await file.writeAsString(
_stub(
observerClassName: observerClassName,
modelClassName: modelClassName,
modelImport: modelImport,
),
);
logger.info('✅ Observer "$observerClassName" created at "$relativePath"');
exitCode = 0;
}