resolve method
Danger<List<FileSystemModelRoute> , CitrusSemanticException>
resolve(
- CitrusSymbolTable symbolTable,
- FileSystemModelRoute target,
- FileSystemModelRouteRoster<
FileSystemModelRoute> base
override
Implementation
@override
Danger<List<FileSystemModelRoute>, CitrusSemanticException> resolve(CitrusSymbolTable symbolTable, FileSystemModelRoute target, FileSystemModelRouteRoster<FileSystemModelRoute> base) {
final log = Log(classLocation: runtimeType, functionLocation: 'resolve');
final arrayAccesserResolveResult = arrayAccesser.resolve(symbolTable);
log.add(arrayAccesserResolveResult);
if (arrayAccesserResolveResult is! Success<CitrusSymbolValue, AccesserException>) return Failure(arrayAccesserResolveResult.asException, log);
final bindCitrusArray = arrayAccesserResolveResult.wrapped;
if (bindCitrusArray is! CitrusArray) return Failure(ForAloneBlockExceptionD(), log.monitor({
'type': bindCitrusArray.runtimeType,
}));
final getLoopTargetResult = getLoopTarget(target, base);
log.add(getLoopTargetResult);
final List<FileSystemModelRoute> list = [];
for (final citrusArrayable in bindCitrusArray.value) {
late final String defineSyntaxSource;
final accesser = temporaryAccessor.identifier;
switch (citrusArrayable) {
case CitrusText(): defineSyntaxSource = '{#define_text $accesser}${citrusArrayable.value}{#define_text}';
case CitrusObject():
final headResult = Head.from(arrayAccesser.identifiers.join());
log.add(headResult);
// identifier は - を使わない かつ not empty なので exception は発生しない.
if (headResult is! Success<Head, HeadException>) Result.panic(CitrusSemanticErrorA(), log);
final box = Some(headResult.wrapped);
final chainStringResult = citrusArrayable.toChainString(box);
log.add(chainStringResult);
// CitrusObject の 各 unit name と head が重複してしまう可能性が存在する.
if (chainStringResult is! Success<String, ChainException>) return Failure(ForAloneBlockExceptionC(), log);
defineSyntaxSource = '{#define_object $accesser}${chainStringResult.wrapped}{#define_object}';
}
// すべての name と content と location に define の記述を冒頭に追加する
for (final i in getLoopTargetResult.wrapped) {
switch (i) {
case FileModelRoute():
final name = defineSyntaxSource + i.name;
final content = Uint8List.fromList([...defineSyntaxSource.codeUnits, ...i.content]);
final location = List.generate(i.location.length, (index) => defineSyntaxSource + i.location.elementAt(index));
final result = FileModelRoute(location, name, content);
list.add(result);
case FolderModelRoute():
final name = defineSyntaxSource + i.name;
final location = List.generate(i.location.length, (index) => defineSyntaxSource + i.location.elementAt(index));
final result = FolderModelRoute(location, name);
list.add(result);
// 対応していない.
case LinkModelRoute(): Result.panic(CitrusSemanticErrorA(), log);
}
}
}
return Success(list, log);
}