/
krasninja
/
querycat
Обзор
Документация
Войти
/
krasninja
/
querycat
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/QueryCat.Backend/Commands/If/IfConditionCommand.cs
48 строк
2 KB
Ivan Kozhin
Initial implementation of IF command
20 май 2024, 09:13
20 май 2024, 09:13
69f5572
Код
Авторство
О чём код?
using QueryCat.Backend.Ast.Nodes; using QueryCat.Backend.Ast.Nodes.If; using QueryCat.Backend.Core.Execution; using QueryCat.Backend.Core.Types; namespace QueryCat.Backend.Commands.If; internal sealed class IfConditionCommand : ICommand { /// <inheritdoc /> public IFuncUnit CreateHandler(IExecutionThread<ExecutionOptions> executionThread, StatementNode node) { var ifConditionNode = (IfConditionNode)node.RootNode; var statementVisitor = new StatementsVisitor(executionThread); var delegateVisitor = new CreateDelegateVisitor(executionThread); var conditionsFuncs = ifConditionNode.ConditionsList.Select(cl => new { Condition = delegateVisitor.RunAndReturn(cl.ConditionNode), Block = statementVisitor.RunAndReturn(cl.BlockExpressionNode), }) .ToArray(); var elseFunc = ifConditionNode.ElseNode != null ? statementVisitor.RunAndReturn(ifConditionNode.ElseNode) : null; VariantValue Func() { foreach (var conditionFunc in conditionsFuncs) { if (conditionFunc.Condition.Invoke().AsBoolean) { return conditionFunc.Block.Invoke(); } } if (elseFunc != null) { return elseFunc.Invoke(); } return VariantValue.Null; } var handler = new FuncUnitDelegate(Func, conditionsFuncs[0].Block.OutputType); return handler; } }