fromBlockSandwich static method

Danger<ForBlockSandwich, CitrusSemanticException> fromBlockSandwich(
  1. BlockSandwich blockSandwich
)

Implementation

static Danger<ForBlockSandwich, CitrusSemanticException> fromBlockSandwich(BlockSandwich blockSandwich) {

    final log = Log(classLocation: ForBlockSandwich, functionLocation: 'fromBlockSandwich');

    final blockTypeKeyword = blockSandwich.first.second.second;

    if (blockTypeKeyword is! For) return Failure(ForBlockSandwichExceptionA(), log.monitor({
        'invalid block type keyword': blockTypeKeyword.runtimeType,
    }));

    final startBlockArgumentable = blockSandwich.first.fourth;

    switch (startBlockArgumentable) {
    case ExpressionCollection():

        final inSettingResult = InSetting.fromExpressionCollection(startBlockArgumentable);
        log.add(inSettingResult);
        if (inSettingResult is! Success<InSetting, ImmatureCitrusSemanticException>) return Failure(inSettingResult.asException, log);

        final joinSettingResult = JoinSetting.fromExpressionCollection(startBlockArgumentable);
        log.add(joinSettingResult);
        if (joinSettingResult is! Success<Box<JoinSetting>, AccesserException>) return Failure(joinSettingResult.asException, log);

        final withSettingListResult = WithSettingList.fromExpressionCollection(startBlockArgumentable);
        log.add(withSettingListResult);
        if (withSettingListResult is! Success<CitrusSemanticList<WithSetting>, AccesserException>) return Failure(withSettingListResult.asException, log);

        final matureCitrusSemanticListResult = CitrusSemanticList.fromDerivationCitrusSyntax(blockSandwich.second);
        log.add(matureCitrusSemanticListResult);

        final finishCitrusSemanticListResult = matureCitrusSemanticListResult.wrapped.asFinish();
        log.add(finishCitrusSemanticListResult);
        if (finishCitrusSemanticListResult is! Success<CitrusSemanticList<FinishCitrusSemantic>, CitrusSemanticException>) return Failure(ForBlockSandwichExceptionJ(), log);

        final result = ForBlockSandwich(blockSandwich.source, inSettingResult.wrapped, joinSettingResult.wrapped, withSettingListResult.wrapped, finishCitrusSemanticListResult.wrapped);

        return Success(result, log);

    case _:

        return Failure(ForBlockSandwichExceptionE(), log.monitor({
            'invalid start block argumentable': startBlockArgumentable.runtimeType,
            'source': startBlockArgumentable.source,
        }));

    }

}