thenGenerateRequest method

Future<CitrusResponse> thenGenerateRequest(
  1. GenerateRequest request
)

Implementation

Future<CitrusResponse> thenGenerateRequest(GenerateRequest request) async {

    final log = Log(classLocation: runtimeType, functionLocation: 'thenGenerateRequest');


    // model を準備する


    final templateFileResult = await FileModel.fromLocationAndName(request.templateFileLocation, request.templateFileName);
    log.add(templateFileResult);
    if (templateFileResult is! Success<FileModel, FileSystemException>) return FailureResponse.fromIncidentWithRequest(request, CitrusEnforcerExceptionA(), log);

    final decodeResult = templateFileResult.wrapped.decode();
    log.add(decodeResult);
    if (decodeResult is! Success<String, FormatException>) return FailureResponse.fromIncidentWithRequest(request, CitrusEnforcerExceptionB(), log);

    final yamlDocumentResult = BpriverYaml.parseYamlStringAsSingleYamlDocument(decodeResult.wrapped);
    log.add(yamlDocumentResult);
    if (yamlDocumentResult is! Success<YamlDocument, BpriverYamlExceptionA>) return FailureResponse.fromIncidentWithRequest(request, yamlDocumentResult.asException, log);

    final yamlMapResult = BpriverYaml.parseYamlDocumentAsT<YamlMap>(yamlDocumentResult.wrapped);
    log.add(yamlMapResult);
    if (yamlMapResult is! Success<YamlMap, BpriverYamlExceptionJ>) return FailureResponse.fromIncidentWithRequest(request, yamlMapResult.asException, log);

    final templateFileSettingResult = TemplateFileSetting.fromYamlMap(yamlMapResult.wrapped);
    log.add(templateFileSettingResult);
    if (templateFileSettingResult is! Success<TemplateFileSetting, BpriverYamlException>) return FailureResponse.fromIncidentWithRequest(request, templateFileSettingResult.asException, log);
    final templateFileSetting = templateFileSettingResult.wrapped;

    final symbolTableStructResult = CitrusSymbolTable.firstStage(request.source, templateFileSetting);
    log.add(symbolTableStructResult);
    if (symbolTableStructResult is! Success<CitrusSymbolTable, CitrusSymbolTableException>) return FailureResponse.fromIncidentWithRequest(request, symbolTableStructResult.asException, log);

    final symbolTableResult = symbolTableStructResult.wrapped.validate();
    log.add(symbolTableResult);
    if (symbolTableResult is! Success<CitrusSymbolTable, CitrusSymbolTableException>) return FailureResponse.fromIncidentWithRequest(request, symbolTableResult.asException, log);
    final symbolTable = symbolTableResult.wrapped;

    final objectDefinitionRosterResult = ObjectDefinitionRoster.result([
        ...templateFileSetting.objectDefinitions,
        ...templateFileSetting.objectArrayDefinitions,
    ]);
    log.add(objectDefinitionRosterResult);
    if (objectDefinitionRosterResult is! Success<ObjectDefinitionRoster, ObjectDefinitionExceptionA>) return FailureResponse.fromIncidentWithRequest(request, objectDefinitionRosterResult.asException, log);
    final objectDefinitionRoster = objectDefinitionRosterResult.wrapped;

    final compileFrameResult = CitrusLanguage.compileFrame(symbolTable, templateFileSetting);
    log.add(compileFrameResult);
    if (compileFrameResult is! Success<FileSystemModelList<FileSystemModel>, CitrusLanguageException>) return FailureResponse.fromIncidentWithRequest(request, compileFrameResult.asException, log);

    final compileFinishResult = CitrusLanguage.compileFinish(symbolTable, compileFrameResult.wrapped, request.generateLocation, objectDefinitionRoster);
    log.add(compileFinishResult);
    if (compileFinishResult is! Success<FileSystemModelList<FileSystemModel>, CitrusLanguageException>) return FailureResponse.fromIncidentWithRequest(request, compileFinishResult.asException, log);


    // file system entity を作成する


    final generateModeResult = GenerateMode.result(request.generateMode);
    log.add(generateModeResult);
    if (generateModeResult is! Success<GenerateMode, GenerateModeExceptionA>) return FailureResponse.fromIncidentWithRequest(request, generateModeResult.asException, log);

    final result = await compileFinishResult.wrapped.create(request.generateLocation, generateModeResult.wrapped);
    log.add(result);
    if (result is! Success<Complete, FileSystemException>) return FailureResponse.fromIncidentWithRequest(request, CitrusEnforcerExceptionA(), log);

    return SuccessResponse.fromRequest(request, [], log);

}