generateRouteDeclaration function

Future generateRouteDeclaration({
  1. required String viewClassName,
  2. required String controllerClassName,
  3. required String controllerInport,
  4. required String viewInport,
  5. required String pageName,
  6. required List<String> pageParameters,
  7. required Map<String, String> pageArgs,
  8. required ArgResults cmdArgs,
  9. required Stream<String> stdInputStream,
})

Implementation

Future generateRouteDeclaration({
  required String viewClassName,
  required String controllerClassName,
  required String controllerInport,
  required String viewInport,
  required String pageName,
  required List<String> pageParameters,
  required Map<String, String> pageArgs,
  required ArgResults cmdArgs,
  required Stream<String> stdInputStream,
}) async {
  File declaredFile = File(defaultRouteDeclarationFileDir);

  final customDeclaredDir =
      cmdArgs.command?.name ??
      cmdArgs.option(CommandFlag.routeDeclarationDir) ??
      '';

  if (customDeclaredDir.isNotEmpty) {
    declaredFile = File(customDeclaredDir);
  }

  if (!declaredFile.existsSync()) {
    declaredFile.createSync(recursive: true);
  }

  final content = declaredFile.readAsStringSync();

  String imports = '';

  if (content.contains(annotation)) {
    imports = content.split(annotation).first.trim();
  } else {
    imports = "import 'package:uloc/uloc.dart';";
  }

  final routesMap = parseULoCRoutesToJson(content);

  final routeName = pageName.toUpperCase();

  final route = ['', pageName, ...pageParameters.map((e) => ':$e')].join('/');

  final params = pageParameters.map((e) => "$e: route?.param('$e')").join(', ');
  final arguments = pageArgs.entries
      .map((e) => "${e.key}: route?.arguments<${e.value}>('${e.key}')")
      .join(', ');

  final functionParam = [
    params,
    arguments,
  ].where((e) => e.isNotEmpty).join(', ');

  final provider = pageParameters.isNotEmpty || pageArgs.isNotEmpty
      ? "(context, route) => $controllerClassName( context, $functionParam )"
      : "(context, _) => $controllerClassName(context)";

  if (routesMap[routeName] != null) {
    await checkExistAndExit(routeName, stdInputStream);
  }
  routesMap[routeName] = RouteDeclaration(
    routeName: routeName,
    route: route,
    providerName: controllerClassName,
    provider: provider,
    arguments: pageArgs,
    child: viewClassName,
  );

  List<String> result = [];

  result.add(imports);
  if (!imports.contains(controllerInport)) {
    result.add(controllerInport);
  }
  if (!imports.contains(viewInport)) {
    result.add(viewInport);
  }
  result.add('');
  result.add('@ULoCDeclaration()');
  result.add('class MyRoutes extends ULoCRouteDeclaration {');
  result.add('  @override');
  result.add('  Map<String, ULoCRouteDefine<ULoCProvider>> get route => {');
  for (RouteDeclaration declaration in routesMap.values) {
    result.add("    '${declaration.routeName}': ULoCRouteDefine(");
    result.add("      route: '${declaration.route}',");
    result.add("      provider: ${declaration.provider},");
    result.add("      child: ${declaration.child},");
    result.add("    ),");
  }
  result.add('  };');
  result.add('}');
  result.add('');
  declaredFile.writeAsStringSync(result.join('\n'));

  print('$green File generated: ${declaredFile.absolute.path} $reset');

  final Command command = Command([
    CommandFlag.genRoute,
    if (cmdArgs.option(CommandFlag.routeDeclarationDir)?.isNotEmpty ??
        false) ...[
      '--${CommandFlag.dir}',
      cmdArgs.option(CommandFlag.routeDeclarationDir) ?? '',
    ],
    if (cmdArgs.option(CommandFlag.routeTargetDir)?.isNotEmpty ?? false) ...[
      '--${CommandFlag.target}',
      cmdArgs.option(CommandFlag.routeTargetDir) ?? '',
    ],
  ]);
  generateRoute(command.cmdArgs.command!);

  exit(0);
}