thenGenerateRequest method
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);
}