resolve method

  1. @override
Danger<List<FileSystemModelRoute>, CitrusSemanticException> resolve(
  1. CitrusSymbolTable symbolTable,
  2. FileSystemModelRoute target,
  3. 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);

}