doRun method

  1. @override
Future<int> doRun()
override

Implementation

@override
Future<int> doRun() async {
  final config = CustomCommandsConfig.instance;
  final configPath = config.getOrCreateConfigPath();

  // Create config file if it doesn't exist
  final configFile = File(configPath);
  if (!configFile.existsSync()) {
    printInfo('Creating new config file: $configPath');
    config.save();
  }

  // Determine editor to use
  final editorArg = argResults!['editor'] as String?;
  final rawEditor = editorArg ??
      Platform.environment['EDITOR'] ??
      Platform.environment['VISUAL'] ??
      (Platform.isMacOS || Platform.isLinux ? 'vim' : 'notepad');

  // SECURITY: Validate editor against whitelist
  String editor;
  try {
    editor = _validateEditor(rawEditor);
  } catch (e) {
    printError(e.toString());
    return 1;
  }

  printInfo('Opening config file in $editor: $configPath');

  try {
    final result = await Process.run(
      editor,
      [configPath],
    );

    if (result.exitCode == 0) {
      printInfo('');
      printInfo('Reloading configuration...');

      // Reload configuration
      try {
        CustomCommandsConfig.reload();
        printInfo('Configuration reloaded successfully');
        return 0;
      } catch (e) {
        printError('Failed to reload configuration: $e');
        printError('Please check the config file for errors');
        return 1;
      }
    } else {
      printError('Editor exited with code: ${result.exitCode}');
      return result.exitCode;
    }
  } catch (e) {
    printError('Failed to open editor: $e');
    printInfo('');
    printInfo('You can edit the file manually at: $configPath');
    return 1;
  }
}