createScreen static method

AFGeneratedFile createScreen(
  1. AFCommandContext context,
  2. String uiName,
  3. AFCommandArgumentsParsed args, {
  4. AFSourceTemplate? buildWithSPI,
  5. AFSourceTemplate? buildBody,
  6. AFSourceTemplate? spiImpls,
  7. AFSourceTemplate? screenImpls,
  8. AFSourceTemplate? routeParamImpls,
  9. AFSourceTemplate? navigatePush,
  10. AFSourceTemplate? createPrototype,
})

Implementation

static AFGeneratedFile createScreen(AFCommandContext context, String uiName, AFCommandArgumentsParsed args, {
  AFSourceTemplate? buildWithSPI,
  AFSourceTemplate? buildBody,
  AFSourceTemplate? spiImpls,
  AFSourceTemplate? screenImpls,
  AFSourceTemplate? routeParamImpls,
  AFSourceTemplate? navigatePush,
  AFSourceTemplate? createPrototype,
}) {
  final controlSettings = findControlKind(uiName);

  if(controlSettings == null) {
    throw AFCommandError(error: "$uiName must end with one of $controlKinds");
  }

  final ns = AFibD.config.appNamespace.toUpperCase();
  final generator = context.generator;

  final minLength = ns.length + controlSettings.suffix.length;
  if(uiName.length <= minLength) {
    throw AFCommandError(error: "$uiName is too short.  It maybe the name of an existing default class.  Please differentiate it.");
  }

  var memberVariables = context.memberVariables(context, args, "${uiName}RouteParam");

  final screenIdType = "$ns${controlSettings.suffix}ID";
  final spiParentType = "$ns${controlSettings.suffix}SPI";

  // create a screen name
  final projectPath = generator.pathUI(uiName, controlSettings);
  final stateView = args.accessNamed(argStateView);
  final stateViewPrefix = generator.removeSuffix(stateView, "StateView");

  final screenId = generator.declareUIID(context, uiName, controlSettings);

  final screenInsertions = context.coreInsertions.reviseAugment({
    ScreenT.insertScreenID: screenId,
    ScreenT.insertScreenIDType: screenIdType,
    ScreenT.insertControlTypeSuffix: controlSettings.suffix,
    AFSourceTemplate.insertMainTypeInsertion: uiName,
    ScreenT.insertStateViewType: stateView,
    ScreenT.insertStateViewPrefix: stateViewPrefix,
  });

  Object standardReviseMethods = AFSourceTemplate.empty;
  if(memberVariables != null && !args.accessNamedFlag(AFGenerateStateSubcommand.argNoReviseMethods)) {
    standardReviseMethods = memberVariables.reviseMethods;
  }

  final routeParamTemplate = routeParamImpls ?? controlSettings.routeParamImpls;
  final routeParamSnippet = context.createSnippet(routeParamTemplate, extend: screenInsertions, insertions: {
    AFSourceTemplate.insertMemberVariablesInsertion: memberVariables?.declareVariables ?? AFSourceTemplate.empty,
    AFSourceTemplate.insertConstructorParamsInsertion: memberVariables?.constructorParams ?? AFSourceTemplate.empty,
    AFSourceTemplate.insertCopyWithParamsInsertion: memberVariables?.copyWithParams ?? AFSourceTemplate.empty,
    AFSourceTemplate.insertCopyWithCallInsertion: memberVariables?.copyWithCall ?? AFSourceTemplate.empty,
    AFSourceTemplate.insertMemberVariableImportsInsertion: memberVariables?.extraImports(context) ?? AFSourceTemplate.empty,
    ModelT.insertReviseMethods: standardReviseMethods,
    ModelT.insertResolveMethods: memberVariables?.resolveMethods ?? AFSourceTemplate.empty,
    AFSourceTemplate.insertCreateParamsInsertion: memberVariables?.routeParamCreateParams ?? AFSourceTemplate.empty,
    AFSourceTemplate.insertCreateParamsCallInsertion: memberVariables?.routeParamCreateCall ?? AFSourceTemplate.empty,
    AFSourceTemplate.insertSuperParamsInsertion: memberVariables?.routeParamSuperParams ?? AFSourceTemplate.empty,
    SnippetStandardRouteParamT.insertWithFlutterStateSuffix: (memberVariables?.withFlutterState ?? false) ? "WithFlutterState" : "",
  });

  final navigatePushTemplate = (navigatePush ?? controlSettings.navigatePush);
  final navigatePushSnippet = context.createSnippet(navigatePushTemplate, extend: screenInsertions, insertions: {
    SnippetNavigatePushT.insertNavigatePushParamDecl: memberVariables?.navigatePushParams ?? AFSourceTemplate.empty,
    SnippetNavigatePushT.insertNavigatePushParamCall: memberVariables?.navigatePushCall ?? AFSourceTemplate.empty,
  });

  final spiSnippet = context.createSnippet(controlSettings.spi, extend: screenInsertions, insertions: {
    AFSourceTemplate.insertMainParentTypeInsertion: spiParentType,
    SnippetDeclareSPIT.insertSPIOnUpdateMethods: memberVariables?.spiOnUpdateMethods ?? AFSourceTemplate.empty,
    SnippetDeclareSPIT.insertSPIResolveMethods: memberVariables?.spiResolveMethods ?? AFSourceTemplate.empty,
    AFSourceTemplate.insertStandardAdditionalMethodsInsertion: controlSettings.implsSPI,
  });

  final superSnippet = context.createSnippet(controlSettings.implsSuper, extend: screenInsertions);

  final templateBody = buildBody ?? controlSettings.implBuildBody;
  final bodySnippet = context.createSnippet(templateBody, extend: screenInsertions);

  var buildWithSPITemplate = buildWithSPI ?? controlSettings.implBuildWithSPI;
  final noBackButton = args.accessNamedFlag(argNoBackButton);
  if(noBackButton) {
    buildWithSPITemplate = SnippetScreenBuildWithSPIImplT.coreNoBackButton();
  }
  final buildWithSPISnippet = context.createSnippet(buildWithSPITemplate, extend: screenInsertions);

  final screenImplsSnippet = context.createSnippet(screenImpls ?? controlSettings.screenAdditionalMethods, extend: screenInsertions);

  final extraImports = context.createSnippet(SnippetExtraImportsT.core(), extend: screenInsertions);
  final extraImportsRouteParam = memberVariables?.extraImports(context);
  if(extraImportsRouteParam != null) {
    extraImports.addLinesAtEnd(context, [extraImportsRouteParam]);
  }

  final paramsConstructorSnippet = context.createSnippet(controlSettings.paramsConstructor, extend: screenInsertions);
  final uiMemberVariablesSnippet = context.createSnippet(SnippetScreenMemberVariableDeclsT.core(), extend: screenInsertions);
  final extraConfig = context.createSnippet(controlSettings.extraConfigParams, extend: screenInsertions, insertions: {
    SnippetCreateScreenPrototypeT.insertNavigatePushParams: memberVariables?.initialValueDeclaration ?? AFSourceTemplate.empty,
  });


  final screenFile = context.createFile(projectPath, ScreenT(), extend: screenInsertions, insertions: {
    AFSourceTemplate.insertExtraImportsInsertion: extraImports,
    ScreenT.insertControlTypeSuffix: controlSettings.suffix,
    ScreenT.insertDeclareRouteParam: routeParamSnippet,
    ScreenT.insertDeclareSPI: spiSnippet,
    ScreenT.insertNavigateMethods: navigatePushSnippet,
    ScreenT.insertBuildBodyImpl: bodySnippet,
    ScreenT.insertBuildWithSPIImpl: buildWithSPISnippet,
    ScreenT.insertExtraConfigParams: extraConfig,
    AFSourceTemplate.insertSuperParamsInsertion: superSnippet,
    AFSourceTemplate.insertAdditionalMethodsInsertion: screenImplsSnippet,
    AFSourceTemplate.insertConstructorParamsInsertion: paramsConstructorSnippet,
    AFSourceTemplate.insertMemberVariablesInsertion: uiMemberVariablesSnippet,
  });

  screenFile.importProjectPath(context, generator.pathConnectedBaseFile);
  final pathStateView = generator.pathStateView(stateView);
  if(pathStateView != null) {
    screenFile.importProjectPath(context, pathStateView);
  }

  /*
  final pathTheme = generator.pathTheme(theme, isCustomParent: false);
  if(pathTheme != null) {
    screenFile.importProjectPath(context, pathTheme);
  }
  */

  // put the screen in the screen map
  if(controlSettings.kind != AFUIControlKind.widget) {
    final declareScreenInMap = context.createSnippet(SnippetDefineScreenMapEntryT(), extend: screenInsertions);

    final screenMapPath = generator.pathDefineCore;
    final screenMapFile = generator.modifyFile(context, screenMapPath);
    screenMapFile.addLinesAfter(context, AFCodeRegExp.startScreenMap, declareScreenInMap.lines);
    screenMapFile.importFile(context, screenFile);
  }

  // create a state test shortcut declaration function.
  final createShortcut = controlSettings.stateTestShortcut as AFSourceTemplate;
  final shortcut = context.createSnippet(createShortcut, extend: screenInsertions);
  final shortcutsFile = generator.modifyFile(context, generator.pathStateTestShortcutsFile);
  shortcutsFile.addLinesAfter(context, AFCodeRegExp.startShortcutsClass, shortcut.lines);

  // import the screen to the state test shortcuts.
  shortcutsFile.importFile(context, screenFile);

  // add exports for files
  final isStartupScreen = uiName == AFGenerateUISubcommand.nameStartupScreen;
  if(isStartupScreen) {
    generator.addExportsForFiles(context, args, [
      screenFile
    ]);

    generator.declareUIIDDirect(context, AFGenerateUISubcommand.nameButtonIncrementRouteParam, controlSettingsWidget);
    generator.declareUIIDDirect(context, AFGenerateUISubcommand.nameTextCountRouteParam, controlSettingsWidget);
  }

  final generatePrototypes = AFibD.config.generateUIPrototypes;
  if(generatePrototypes) {
    final smokeTestImpl = context.createSnippet(controlSettings.smokeTestImpl);

    // create a new screen test files
    final protoName = "${uiName}InitialPrototype";
    final protoId = generator.declarePrototypeID(context, protoName);
    final pathScreenTest = generator.pathScreenTest(uiName, controlSettings);
    final createProto = context.createSnippet(createPrototype ?? controlSettings.createPrototype, insertions: {
      SnippetCreateScreenPrototypeT.insertNavigatePushParams: memberVariables?.initialValueDeclaration ?? AFSourceTemplate.empty,
    });

    final screenTestFile = context.createFile(pathScreenTest, ScreenTestT.core(), insertions: {
        AFSourceTemplate.insertExtraImportsInsertion: "",
        AFSourceTemplate.insertMainTypeInsertion: uiName,
        ScreenT.insertScreenID: protoId,
        ScreenT.insertControlTypeSuffix: controlSettings.suffix,
        ScreenTestT.insertDeclarePrototype: createProto,
        ScreenTestT.insertSmokeTestImpl: smokeTestImpl,
        SnippetCreateScreenPrototypeT.insertFullTestDataID: generator.stateFullLoginID,
    });

    screenTestFile.importFile(context, screenFile);

    // add in a link to the defining function to the main tests file.
    final pathScreenTests = generator.pathScreenTests;
    final screenTestsFile = generator.modifyFile(context, pathScreenTests);

    // add the imports
    screenTestsFile.importFile(context, screenTestFile);

    final callFunction = context.createSnippet(SnippetCallDefineScreenTest(), extend: screenInsertions);
    screenTestsFile.addLinesAfter(context, AFCodeRegExp.startDefineUIProtoypesFunction, callFunction.lines);
  }

  return screenFile;
}