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