handle method

  1. @override
Future<void> handle(
  1. List<String> args
)
override

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;
}