fromAloneBlock static method

Danger<IfAloneBlock, CitrusSemanticException> fromAloneBlock(
  1. AloneBlock aloneBlock
)

Implementation

static Danger<IfAloneBlock, CitrusSemanticException> fromAloneBlock(AloneBlock aloneBlock) {

    final log = Log(classLocation: IfAloneBlock, functionLocation: 'fromAloneBlock');

    final blockTypeKeyword = aloneBlock.second;

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

    final aloneBlockArgumentable = aloneBlock.fourth;

    late final Boolean boolean;

    switch (aloneBlockArgumentable) {
    case OperatorExpression():

        final operator = aloneBlockArgumentable.third;

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

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

        if (operator is! EqualEqual) return Failure(IfAloneBlockExceptionA(), log.monitor({
            'invalid operator type': operator.runtimeType,
        }));

        boolean = EqualityComparison(leftResult.wrapped, rightResult.wrapped);

    case AccesserableCollection():

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

        boolean = FlagSemantic(accesserResult.wrapped);

    case _:

        return Failure(IfAloneBlockExceptionB(), log.monitor({
            'invalid alone block argumentable': aloneBlockArgumentable.runtimeType,
        }));

    }

    final result = IfAloneBlock(aloneBlock.source, blockTypeKeyword, boolean);

    return Success(result, log);

}