mirror of https://github.com/PurpleI2P/i2pd.git
I2P: End-to-End encrypted and anonymous Internet
https://i2pd.website/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.4 KiB
140 lines
4.4 KiB
3 years ago
|
#ifndef INCLUDE_INJA_FUNCTION_STORAGE_HPP_
|
||
|
#define INCLUDE_INJA_FUNCTION_STORAGE_HPP_
|
||
|
|
||
|
#include <string_view>
|
||
|
#include <vector>
|
||
|
|
||
|
namespace inja {
|
||
|
|
||
|
using Arguments = std::vector<const json*>;
|
||
|
using CallbackFunction = std::function<json(Arguments& args)>;
|
||
|
using VoidCallbackFunction = std::function<void(Arguments& args)>;
|
||
|
|
||
|
/*!
|
||
|
* \brief Class for builtin functions and user-defined callbacks.
|
||
|
*/
|
||
|
class FunctionStorage {
|
||
|
public:
|
||
|
enum class Operation {
|
||
|
Not,
|
||
|
And,
|
||
|
Or,
|
||
|
In,
|
||
|
Equal,
|
||
|
NotEqual,
|
||
|
Greater,
|
||
|
GreaterEqual,
|
||
|
Less,
|
||
|
LessEqual,
|
||
|
Add,
|
||
|
Subtract,
|
||
|
Multiplication,
|
||
|
Division,
|
||
|
Power,
|
||
|
Modulo,
|
||
|
AtId,
|
||
|
At,
|
||
|
Default,
|
||
|
DivisibleBy,
|
||
|
Even,
|
||
|
Exists,
|
||
|
ExistsInObject,
|
||
|
First,
|
||
|
Float,
|
||
|
Int,
|
||
|
IsArray,
|
||
|
IsBoolean,
|
||
|
IsFloat,
|
||
|
IsInteger,
|
||
|
IsNumber,
|
||
|
IsObject,
|
||
|
IsString,
|
||
|
Last,
|
||
|
Length,
|
||
|
Lower,
|
||
|
Max,
|
||
|
Min,
|
||
|
Odd,
|
||
|
Range,
|
||
|
Round,
|
||
|
Sort,
|
||
|
Upper,
|
||
|
Super,
|
||
|
Join,
|
||
|
Callback,
|
||
|
ParenLeft,
|
||
|
ParenRight,
|
||
|
None,
|
||
|
};
|
||
|
|
||
|
struct FunctionData {
|
||
|
explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
|
||
|
const Operation operation;
|
||
|
const CallbackFunction callback;
|
||
|
};
|
||
|
|
||
|
private:
|
||
|
const int VARIADIC {-1};
|
||
|
|
||
|
std::map<std::pair<std::string, int>, FunctionData> function_storage = {
|
||
|
{std::make_pair("at", 2), FunctionData {Operation::At}},
|
||
|
{std::make_pair("default", 2), FunctionData {Operation::Default}},
|
||
|
{std::make_pair("divisibleBy", 2), FunctionData {Operation::DivisibleBy}},
|
||
|
{std::make_pair("even", 1), FunctionData {Operation::Even}},
|
||
|
{std::make_pair("exists", 1), FunctionData {Operation::Exists}},
|
||
|
{std::make_pair("existsIn", 2), FunctionData {Operation::ExistsInObject}},
|
||
|
{std::make_pair("first", 1), FunctionData {Operation::First}},
|
||
|
{std::make_pair("float", 1), FunctionData {Operation::Float}},
|
||
|
{std::make_pair("int", 1), FunctionData {Operation::Int}},
|
||
|
{std::make_pair("isArray", 1), FunctionData {Operation::IsArray}},
|
||
|
{std::make_pair("isBoolean", 1), FunctionData {Operation::IsBoolean}},
|
||
|
{std::make_pair("isFloat", 1), FunctionData {Operation::IsFloat}},
|
||
|
{std::make_pair("isInteger", 1), FunctionData {Operation::IsInteger}},
|
||
|
{std::make_pair("isNumber", 1), FunctionData {Operation::IsNumber}},
|
||
|
{std::make_pair("isObject", 1), FunctionData {Operation::IsObject}},
|
||
|
{std::make_pair("isString", 1), FunctionData {Operation::IsString}},
|
||
|
{std::make_pair("last", 1), FunctionData {Operation::Last}},
|
||
|
{std::make_pair("length", 1), FunctionData {Operation::Length}},
|
||
|
{std::make_pair("lower", 1), FunctionData {Operation::Lower}},
|
||
|
{std::make_pair("max", 1), FunctionData {Operation::Max}},
|
||
|
{std::make_pair("min", 1), FunctionData {Operation::Min}},
|
||
|
{std::make_pair("odd", 1), FunctionData {Operation::Odd}},
|
||
|
{std::make_pair("range", 1), FunctionData {Operation::Range}},
|
||
|
{std::make_pair("round", 2), FunctionData {Operation::Round}},
|
||
|
{std::make_pair("sort", 1), FunctionData {Operation::Sort}},
|
||
|
{std::make_pair("upper", 1), FunctionData {Operation::Upper}},
|
||
|
{std::make_pair("super", 0), FunctionData {Operation::Super}},
|
||
|
{std::make_pair("super", 1), FunctionData {Operation::Super}},
|
||
|
{std::make_pair("join", 2), FunctionData {Operation::Join}},
|
||
|
};
|
||
|
|
||
|
public:
|
||
|
void add_builtin(std::string_view name, int num_args, Operation op) {
|
||
|
function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {op});
|
||
|
}
|
||
|
|
||
|
void add_callback(std::string_view name, int num_args, const CallbackFunction& callback) {
|
||
|
function_storage.emplace(std::make_pair(static_cast<std::string>(name), num_args), FunctionData {Operation::Callback, callback});
|
||
|
}
|
||
|
|
||
|
FunctionData find_function(std::string_view name, int num_args) const {
|
||
|
auto it = function_storage.find(std::make_pair(static_cast<std::string>(name), num_args));
|
||
|
if (it != function_storage.end()) {
|
||
|
return it->second;
|
||
|
|
||
|
// Find variadic function
|
||
|
} else if (num_args > 0) {
|
||
|
it = function_storage.find(std::make_pair(static_cast<std::string>(name), VARIADIC));
|
||
|
if (it != function_storage.end()) {
|
||
|
return it->second;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return FunctionData {Operation::None};
|
||
|
}
|
||
|
};
|
||
|
|
||
|
} // namespace inja
|
||
|
|
||
|
#endif // INCLUDE_INJA_FUNCTION_STORAGE_HPP_
|