use get_argument function in callbacks

This commit is contained in:
pantor committed 2018-02-18 18:56:35 +01:00
1 parent 693bf63493
commit f931a95800
3 files changed
+16 -12

No files matched your search

+1 -1
View File
@@ -201,7 +201,7 @@ Environment env = Environment();
* - callback function. Implemented with std::function, you can for example use lambdas. * - callback function. Implemented with std::function, you can for example use lambdas.
*/ */
env.add_callback("double", 1, [&env](Parsed::Arguments args, json data) { env.add_callback("double", 1, [&env](Parsed::Arguments args, json data) {
const int number = env.renderer.eval_expression<int>(args[0], data); // Adapt the type and index of the argument int number = env.get_argument<int>(args, 0, data); // Adapt the type and index of the argument
return 2 * number; return 2 * number;
}); });
+11 -7
View File
@@ -193,7 +193,6 @@ inline MatchType<T> match(const std::string& input, std::map<T, Regex> regexes)
return match; return match;
} }
} }
// throw std::runtime_error("Could not match input: " + input);
return match; return match;
} }
@@ -447,7 +446,7 @@ public:
case Parsed::Function::Default: { case Parsed::Function::Default: {
try { try {
return eval_expression(element.args[0], data); return eval_expression(element.args[0], data);
} catch (std::exception e) { } catch (std::exception& exception) {
return eval_expression(element.args[1], data); return eval_expression(element.args[1], data);
} }
} }
@@ -842,17 +841,22 @@ public:
return parser.load_file(input_path + filename); return parser.load_file(input_path + filename);
} }
void add_callback(std::string name, int number_arguments, std::function<json(Parsed::Arguments, json)> callback) {
parser.regex_map_callbacks[name] = Parser::function_regex(name, number_arguments);
renderer.map_callbacks[name] = callback;
}
json load_json(const std::string& filename) { json load_json(const std::string& filename) {
std::ifstream file(input_path + filename); std::ifstream file(input_path + filename);
json j; json j;
file >> j; file >> j;
return j; return j;
} }
void add_callback(std::string name, int number_arguments, std::function<json(Parsed::Arguments, json)> callback) {
parser.regex_map_callbacks[name] = Parser::function_regex(name, number_arguments);
renderer.map_callbacks[name] = callback;
}
template<typename T>
T get_argument(Parsed::Arguments args, int index, json data) {
return renderer.eval_expression<T>(args[index], data);
}
}; };
+4 -4
View File
@@ -150,12 +150,12 @@ TEST_CASE("callbacks") {
data["age"] = 28; data["age"] = 28;
env.add_callback("double", 1, [&env](inja::Parsed::Arguments args, json data) { env.add_callback("double", 1, [&env](inja::Parsed::Arguments args, json data) {
const int number = env.renderer.eval_expression<int>(args[0], data); int number = env.get_argument<double>(args, 0, data);
return 2 * number; return 2 * number;
}); });
env.add_callback("half", 1, [&env](inja::Parsed::Arguments args, json data) { env.add_callback("half", 1, [&env](inja::Parsed::Arguments args, json data) {
const int number = env.renderer.eval_expression<int>(args[0], data); int number = env.get_argument<double>(args, 0, data);
return number / 2; return number / 2;
}); });
@@ -165,8 +165,8 @@ TEST_CASE("callbacks") {
}); });
env.add_callback("multiply", 2, [&env](inja::Parsed::Arguments args, json data) { env.add_callback("multiply", 2, [&env](inja::Parsed::Arguments args, json data) {
const double number1 = env.renderer.eval_expression<double>(args[0], data); double number1 = env.get_argument<double>(args, 0, data);
const double number2 = env.renderer.eval_expression<double>(args[1], data); double number2 = env.get_argument<double>(args, 1, data);
return number1 * number2; return number1 * number2;
}); });