24 enum class Operation {
77 explicit FunctionData(
const Operation& op,
const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
78 const Operation operation;
79 const CallbackFunction callback;
83 const int VARIADIC {-1};
85 std::map<std::pair<std::string, int>, FunctionData> function_storage = {
86 {std::make_pair(
"at", 2), FunctionData {Operation::At}},
87 {std::make_pair(
"capitalize", 1), FunctionData {Operation::Capitalize}},
88 {std::make_pair(
"default", 2), FunctionData {Operation::Default}},
89 {std::make_pair(
"divisibleBy", 2), FunctionData {Operation::DivisibleBy}},
90 {std::make_pair(
"even", 1), FunctionData {Operation::Even}},
91 {std::make_pair(
"exists", 1), FunctionData {Operation::Exists}},
92 {std::make_pair(
"existsIn", 2), FunctionData {Operation::ExistsInObject}},
93 {std::make_pair(
"first", 1), FunctionData {Operation::First}},
94 {std::make_pair(
"float", 1), FunctionData {Operation::Float}},
95 {std::make_pair(
"int", 1), FunctionData {Operation::Int}},
96 {std::make_pair(
"isArray", 1), FunctionData {Operation::IsArray}},
97 {std::make_pair(
"isBoolean", 1), FunctionData {Operation::IsBoolean}},
98 {std::make_pair(
"isFloat", 1), FunctionData {Operation::IsFloat}},
99 {std::make_pair(
"isInteger", 1), FunctionData {Operation::IsInteger}},
100 {std::make_pair(
"isNumber", 1), FunctionData {Operation::IsNumber}},
101 {std::make_pair(
"isObject", 1), FunctionData {Operation::IsObject}},
102 {std::make_pair(
"isString", 1), FunctionData {Operation::IsString}},
103 {std::make_pair(
"last", 1), FunctionData {Operation::Last}},
104 {std::make_pair(
"length", 1), FunctionData {Operation::Length}},
105 {std::make_pair(
"lower", 1), FunctionData {Operation::Lower}},
106 {std::make_pair(
"max", 1), FunctionData {Operation::Max}},
107 {std::make_pair(
"min", 1), FunctionData {Operation::Min}},
108 {std::make_pair(
"odd", 1), FunctionData {Operation::Odd}},
109 {std::make_pair(
"range", 1), FunctionData {Operation::Range}},
110 {std::make_pair(
"replace", 3), FunctionData {Operation::Replace}},
111 {std::make_pair(
"round", 2), FunctionData {Operation::Round}},
112 {std::make_pair(
"sort", 1), FunctionData {Operation::Sort}},
113 {std::make_pair(
"upper", 1), FunctionData {Operation::Upper}},
114 {std::make_pair(
"super", 0), FunctionData {Operation::Super}},
115 {std::make_pair(
"super", 1), FunctionData {Operation::Super}},
116 {std::make_pair(
"join", 2), FunctionData {Operation::Join}},
120 void add_builtin(std::string_view name,
int num_args, Operation op) {
121 function_storage.emplace(std::make_pair(
static_cast<std::string
>(name), num_args), FunctionData {op});
124 void add_callback(std::string_view name,
int num_args,
const CallbackFunction& callback) {
125 function_storage.emplace(std::make_pair(
static_cast<std::string
>(name), num_args), FunctionData {Operation::Callback, callback});
128 FunctionData find_function(std::string_view name,
int num_args)
const {
129 auto it = function_storage.find(std::make_pair(
static_cast<std::string
>(name), num_args));
130 if (it != function_storage.end()) {
134 }
else if (num_args > 0) {
135 it = function_storage.find(std::make_pair(
static_cast<std::string
>(name), VARIADIC));
136 if (it != function_storage.end()) {
141 return FunctionData {Operation::None};