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.content.decode();
    log.add(decodeResult);
    if (decodeResult is! Success<StringContent, FormatException>) return FailureResponse.fromIncidentWithRequest(request, CitrusEnforcerExceptionB(), log);

    final yamlDocumentResult = BpriverYaml.parseYamlStringAsSingleYamlDocument(decodeResult.wrapped.value);
    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 templateSettingStructResult = TemplateSettingStruct.fromYamlMap(yamlMapResult.wrapped);
    log.add(templateSettingStructResult);
    if (templateSettingStructResult is! Success<TemplateSettingStruct, BpriverYamlException>) return FailureResponse.fromIncidentWithRequest(request, templateSettingStructResult.asException, log);
    final templateSettingStruct = templateSettingStructResult.wrapped;

    // property table を作成.
    // permanently と list property のみセットする.
    // fragment はまだセットしない.

    final propertyTableStructResult = PropertyTableStruct.firstStage(request.chain, templateSettingStruct);
    log.add(propertyTableStructResult);
    if (propertyTableStructResult is! Success<PropertyTableStruct, ChainException>) return FailureResponse.fromIncidentWithRequest(request, propertyTableStructResult.asException, log);

    final propertyTableResult = PropertyTable.fromStruct(propertyTableStructResult.wrapped);
    log.add(propertyTableResult);
    if (propertyTableResult is! Success<PropertyTable, PropertyTableException>) return FailureResponse.fromIncidentWithRequest(request, propertyTableResult.asException, log);
    final firstPropertyTable = propertyTableResult.wrapped;

    // fragment を compile する.
    final List<FragmentProperty> list = [];

    for (final i in templateSettingStruct.fragmentPropertyRoster) {

        final compileResult = CitrusSemantic.compile(i.value, firstPropertyTable);
        log.add(compileResult);
        if (compileResult is! Success<String, CitrusSemanticException>) return FailureResponse.fromIncidentWithRequest(request, compileResult.asException, log);

        final structResult = FragmentPropertyStruct(i.name, compileResult.wrapped);

        final result = FragmentProperty.fromStruct(structResult);
        log.add(result);

        list.add(result.wrapped);

    }

    final fragmentPropertyRosterResult = PropertyRoster.result(list);
    log.add(fragmentPropertyRosterResult);
    if (fragmentPropertyRosterResult is! Success<PropertyRoster<FragmentProperty>, PropertyExceptionA>) return FailureResponse.fromIncidentWithRequest(request, fragmentPropertyRosterResult.asException, log);

    final changeFragmentPropertyRosterResult = firstPropertyTable.changeFragmentPropertyRoster(fragmentPropertyRosterResult.wrapped);
    log.add(changeFragmentPropertyRosterResult);
    if (changeFragmentPropertyRosterResult is! Success<PropertyTable, PropertyTableExceptionA>) return FailureResponse.fromIncidentWithRequest(request, changeFragmentPropertyRosterResult.asException, log);
    final secondPropertyTable = changeFragmentPropertyRosterResult.wrapped;

    // citrus sytax を compile した FileSystemModelList を作成する.

    final changeExhaustiveResult = templateSettingStruct.template.changeExhaustive<CitrusEnforcerException>((old) {
        switch (old) {
        case FileModel():

            final nameResult = CitrusSemantic.compile(old.name, secondPropertyTable);
            log.add(nameResult);
            if (nameResult is! Success<String, CitrusSemanticException>) return Failure(CitrusEnforcerExceptionC(), log);

            final decodeResult = old.content.decode();
            log.add(decodeResult);
            if (decodeResult is! Success<StringContent, FormatException>) return Failure(CitrusEnforcerExceptionB(), log);;

            final contentResult = CitrusSemantic.compile(decodeResult.wrapped.value, secondPropertyTable);
            log.add(contentResult);
            if (contentResult is! Success<String, CitrusSemanticException>) return Failure(CitrusEnforcerExceptionC(), log);;

            final result = FileModel(nameResult.wrapped, contentResult.wrapped);
            return Success(result, log);

        case FolderModel():

            final nameResult = CitrusSemantic.compile(old.name, secondPropertyTable);
            log.add(nameResult);
            if (nameResult is! Success<String, CitrusSemanticException>) return Failure(CitrusEnforcerExceptionC(), log);

            final result = FolderModel(nameResult.wrapped, old.content);

            return Success(result, log);

        case _:
            // yaml file からの FileSystemModel の生成なので FileModel or FolderModel しか生成しない.
            Result.panic(CitrusEnforcerErrorA(), log);
        }
    });
    log.add(changeExhaustiveResult);
    if (changeExhaustiveResult is! Success<FileSystemModelList<FileSystemModel>, CitrusEnforcerException>) return FailureResponse.fromIncidentWithRequest(request, changeExhaustiveResult.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 changeExhaustiveResult.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);

}