Inja 3.5.0
A Template Engine for Modern C++
Loading...
Searching...
No Matches
function_storage.hpp
1#ifndef INCLUDE_INJA_FUNCTION_STORAGE_HPP_
2#define INCLUDE_INJA_FUNCTION_STORAGE_HPP_
3
4#include <functional>
5#include <map>
6#include <string>
7#include <string_view>
8#include <utility>
9#include <vector>
10
11#include "json.hpp"
12
13namespace inja {
14
15using Arguments = std::vector<const json*>;
16using CallbackFunction = std::function<json(Arguments& args)>;
17using VoidCallbackFunction = std::function<void(Arguments& args)>;
18
23public:
24 enum class Operation {
25 Not,
26 And,
27 Or,
28 In,
29 Equal,
30 NotEqual,
31 Greater,
32 GreaterEqual,
33 Less,
34 LessEqual,
35 Add,
36 Subtract,
37 Multiplication,
38 Division,
39 Power,
40 Modulo,
41 AtId,
42 At,
43 Capitalize,
44 Default,
45 DivisibleBy,
46 Even,
47 Exists,
48 ExistsInObject,
49 First,
50 Float,
51 Int,
52 IsArray,
53 IsBoolean,
54 IsFloat,
55 IsInteger,
56 IsNumber,
57 IsObject,
58 IsString,
59 Last,
60 Length,
61 Lower,
62 Max,
63 Min,
64 Odd,
65 Range,
66 Replace,
67 Round,
68 Sort,
69 Upper,
70 Super,
71 Join,
72 Callback,
73 None,
74 };
75
76 struct FunctionData {
77 explicit FunctionData(const Operation& op, const CallbackFunction& cb = CallbackFunction {}): operation(op), callback(cb) {}
78 const Operation operation;
79 const CallbackFunction callback;
80 };
81
82private:
83 const int VARIADIC {-1};
84
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}},
117 };
118
119public:
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});
122 }
123
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});
126 }
127
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()) {
131 return it->second;
132
133 // Find variadic function
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()) {
137 return it->second;
138 }
139 }
140
141 return FunctionData {Operation::None};
142 }
143};
144
145} // namespace inja
146
147#endif // INCLUDE_INJA_FUNCTION_STORAGE_HPP_
Class for builtin functions and user-defined callbacks.
Definition function_storage.hpp:22
Definition function_storage.hpp:76