generateRouteDeclaration function
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,
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);
}