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.
139 lines
4.4 KiB
139 lines
4.4 KiB
#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_
|
|
|