Cook Book

Default setup:

from dynamic_expressions.dispatcher import VisitorDispatcher
from dynamic_expressions.types import EmptyContext
from dynamic_expressions.nodes import (
    AllOfNode,
    AnyOfNode,
    BinaryExpressionNode,
    CoalesceNode,
    LiteralNode,
    MatchNode,
)
from dynamic_expressions.visitors import (
    AllOfVisitor,
    AnyOfVisitor,
    BinaryExpressionVisitor,
    CoalesceVisitor,
    LiteralVisitor,
    MatchVisitor,
)


def create_dispatcher() -> VisitorDispatcher[EmptyContext]:
    return VisitorDispatcher[EmptyContext](
        visitors={
            AllOfNode: AllOfVisitor(),
            AnyOfNode: AnyOfVisitor(),
            BinaryExpressionNode: BinaryExpressionVisitor(),
            LiteralNode: LiteralVisitor(),
            CoalesceNode: CoalesceVisitor(),
            MatchNode: MatchVisitor(),
        },
    )


async def main() -> None:
    dispatcher = create_dispatcher()
    node = BinaryExpressionNode(
        operator="+",
        left=LiteralNode(value=1),
        right=LiteralNode(value=2),
    )
    result = await dispatcher.visit(node, None)
    assert result == 3