run method

  1. @override
Future<void> run(
  1. List<String> args, {
  2. required Logger logger,
})
override

The execution body of the command.

Implementation

@override
Future<void> run(List<String> args, {required Logger logger}) async {
  if (args.isEmpty) {
    logger.error('Usage: deeplink add-scheme <scheme-name>');
    return;
  }

  final newScheme = args.first.trim().toLowerCase();
  if (newScheme.isEmpty) {
    logger.error('Scheme name cannot be empty.');
    return;
  }

  final finder = ProjectFinder();
  final projectRoot = finder.findProjectRoot();
  final project = FlutterProject(projectRoot);

  final configManager = ConfigManager(projectRoot);
  if (!configManager.configExists()) {
    logger.error('No configuration found. Please run "deeplink init" first.');
    return;
  }

  final config = configManager.load();
  if (config.schemes.contains(newScheme)) {
    logger.warning('Scheme "$newScheme" is already configured.');
    return;
  }

  final spinner = Spinner('Adding scheme "$newScheme"...');
  spinner.start();

  try {
    // 1. Update AndroidManifest.xml
    if (FileUtils.exists(project.androidManifestPath)) {
      var manifestContent = FileUtils.readAsString(project.androidManifestPath);
      manifestContent = AndroidManifestEditor().addScheme(manifestContent, newScheme);
      FileUtils.writeString(project.androidManifestPath, manifestContent);
    }

    // 2. Update Info.plist
    if (FileUtils.exists(project.iosPlistPath)) {
      var plistContent = FileUtils.readAsString(project.iosPlistPath);
      plistContent = PlistEditor().addScheme(plistContent, newScheme);
      FileUtils.writeString(project.iosPlistPath, plistContent);
    }

    // 3. Update Configuration and regenerate Flutter constants
    final updatedSchemes = List<String>.from(config.schemes)..add(newScheme);
    final updatedConfig = DeepLinkConfig(
      schemes: updatedSchemes,
      generateSampleRoutes: config.generateSampleRoutes,
      generateDeepLinkManager: config.generateDeepLinkManager,
      androidAppLinks: config.androidAppLinks,
      iosUniversalLinks: config.iosUniversalLinks,
      domains: config.domains,
    );

    configManager.save(updatedConfig);

    final generator = FlutterGenerator(projectRoot, logger);
    generator.generate(updatedConfig);

    spinner.stop(success: true, finalMessage: 'Scheme "$newScheme" added and configured successfully.');
  } catch (e) {
    spinner.stop(success: false, finalMessage: 'Failed to add scheme.');
    logger.error('Failed to add scheme: ${e.toString()}');
  }
}