fromBlockSandwich static method

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

Implementation

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

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

    final blockTypeKeyword = blockSandwich.first.second.second;

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

    final startBlockArgumentable = blockSandwich.first.fourth;

    late final Boolean boolean;

    switch (startBlockArgumentable) {
    case OperatorExpression():

        final operator = startBlockArgumentable.third;

        final leftResult = Accesser.fromAccesserableCollection(startBlockArgumentable.first);
        log.add(leftResult);
        if (leftResult is! Success<Accesser, AccesserException>) return Failure(leftResult.asException, log);

        final rightResult = Accesser.fromAccesserableCollection(startBlockArgumentable.fifth);
        log.add(rightResult);
        if (rightResult is! Success<Accesser, AccesserException>) return Failure(rightResult.asException, log);

        if (operator is EqualEqual) boolean = EqualityComparison(leftResult.wrapped, rightResult.wrapped);
        else return Failure(IfBlockSandwichExceptionD(), log.monitor({
            'invalid operator type': operator.runtimeType,
        }));

    case AccesserableCollection():

        final accesserResult = Accesser.fromAccesserableCollection(startBlockArgumentable);
        log.add(accesserResult);
        if (accesserResult is! Success<Accesser, AccesserException>) return Failure(accesserResult.asException, log);

        boolean = Flag(accesserResult.wrapped);

    case _:

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

    }

    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(IfBlockSandwichExceptionE(), log);

    final result = IfBlockSandwich(blockSandwich.source, blockTypeKeyword, boolean, finishCitrusSemanticListResult.wrapped);

    return Success(result, log);

}