aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/providers/common/transform/yql_visit.cpp
blob: 990c745859422d04c23ac8ded7ed5b76a19f1711 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "yql_visit.h"

#include <yql/essentials/utils/yql_panic.h>

#include <util/string/builder.h>

namespace NYql {

void TVisitorTransformerBase::AddHandler(std::initializer_list<TStringBuf> names, THandler handler) {
    for (auto name: names) {
        YQL_ENSURE(Handlers.emplace(name, handler).second, "Duplicate handler for " << name);
    }
}

IGraphTransformer::TStatus TVisitorTransformerBase::DoTransform(TExprNode::TPtr input, TExprNode::TPtr& output, TExprContext& ctx) {
    YQL_ENSURE(input->Type() == TExprNode::Callable);
    output = input;

    if (auto handler = Handlers.FindPtr(input->Content())) {
        return (*handler)(input, output, ctx);
    }
    if (FailOnUnknown) {
        ctx.AddError(TIssue(ctx.GetPosition(input->Pos()), TStringBuilder() << "Unsupported callable: " << input->Content()));
        return TStatus::Error;
    }
    return TStatus::Ok;
}

}