mirror of
https://github.com/pantor/inja.git
synced 2026-05-18 18:25:23 +00:00
add void callbacks
This commit is contained in:
@@ -302,6 +302,12 @@ env.add_callback("double-greetings", 0, [greet](Arguments args) {
|
||||
return greet + " " + greet + "!";
|
||||
});
|
||||
env.render("{{ double-greetings }}", data); // "Hello Hello!"
|
||||
|
||||
// You can also add a callback without return variable, e.g. for debugging:
|
||||
env.add_void_callback("log", 1, [greet](Arguments args) {
|
||||
std::cout << "logging: " << args[0] << std::endl;
|
||||
});
|
||||
env.render("{{ log(neighbour) }}", data); // Prints nothing to result, only to cout...
|
||||
```
|
||||
|
||||
### Comments
|
||||
|
||||
@@ -173,7 +173,14 @@ public:
|
||||
@brief Adds a variadic callback
|
||||
*/
|
||||
void add_callback(const std::string &name, const CallbackFunction &callback) {
|
||||
function_storage.add_callback(name, -1, callback);
|
||||
add_callback(name, -1, callback);
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Adds a variadic void callback
|
||||
*/
|
||||
void add_void_callback(const std::string &name, const VoidCallbackFunction &callback) {
|
||||
add_void_callback(name, -1, callback);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -183,6 +190,13 @@ public:
|
||||
function_storage.add_callback(name, num_args, callback);
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Adds a void callback with given number or arguments
|
||||
*/
|
||||
void add_void_callback(const std::string &name, int num_args, const VoidCallbackFunction &callback) {
|
||||
function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
|
||||
}
|
||||
|
||||
/** Includes a template with a given name into the environment.
|
||||
* Then, a template can be rendered in another template using the
|
||||
* include "<name>" syntax.
|
||||
|
||||
@@ -13,6 +13,7 @@ using json = nlohmann::json;
|
||||
|
||||
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.
|
||||
|
||||
@@ -54,10 +54,9 @@ class Renderer : public NodeVisitor {
|
||||
void print_json(const std::shared_ptr<json> value) {
|
||||
if (value->is_string()) {
|
||||
*output_stream << value->get_ref<const json::string_t&>();
|
||||
} else if (value->is_number_float()) {
|
||||
*output_stream << value->dump();
|
||||
} else if (value->is_number_integer()) {
|
||||
*output_stream << value->get<const json::number_integer_t>();
|
||||
} else if (value->is_null()) {
|
||||
} else {
|
||||
*output_stream << value->dump();
|
||||
}
|
||||
|
||||
@@ -1526,6 +1526,7 @@ using json = nlohmann::json;
|
||||
|
||||
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.
|
||||
@@ -3348,10 +3349,9 @@ class Renderer : public NodeVisitor {
|
||||
void print_json(const std::shared_ptr<json> value) {
|
||||
if (value->is_string()) {
|
||||
*output_stream << value->get_ref<const json::string_t&>();
|
||||
} else if (value->is_number_float()) {
|
||||
*output_stream << value->dump();
|
||||
} else if (value->is_number_integer()) {
|
||||
*output_stream << value->get<const json::number_integer_t>();
|
||||
} else if (value->is_null()) {
|
||||
} else {
|
||||
*output_stream << value->dump();
|
||||
}
|
||||
@@ -4061,7 +4061,14 @@ public:
|
||||
@brief Adds a variadic callback
|
||||
*/
|
||||
void add_callback(const std::string &name, const CallbackFunction &callback) {
|
||||
function_storage.add_callback(name, -1, callback);
|
||||
add_callback(name, -1, callback);
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Adds a variadic void callback
|
||||
*/
|
||||
void add_void_callback(const std::string &name, const VoidCallbackFunction &callback) {
|
||||
add_void_callback(name, -1, callback);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -4071,6 +4078,13 @@ public:
|
||||
function_storage.add_callback(name, num_args, callback);
|
||||
}
|
||||
|
||||
/*!
|
||||
@brief Adds a void callback with given number or arguments
|
||||
*/
|
||||
void add_void_callback(const std::string &name, int num_args, const VoidCallbackFunction &callback) {
|
||||
function_storage.add_callback(name, num_args, [callback](Arguments& args) { callback(args); return json(); });
|
||||
}
|
||||
|
||||
/** Includes a template with a given name into the environment.
|
||||
* Then, a template can be rendered in another template using the
|
||||
* include "<name>" syntax.
|
||||
|
||||
@@ -228,10 +228,15 @@ TEST_CASE("callbacks") {
|
||||
return number1.length();
|
||||
});
|
||||
|
||||
env.add_void_callback("log", 1, [](inja::Arguments args) {
|
||||
int a = 2;
|
||||
});
|
||||
|
||||
env.add_callback("multiply", 0, [](inja::Arguments args) { return 1.0; });
|
||||
|
||||
CHECK(env.render("{{ double(age) }}", data) == "56");
|
||||
CHECK(env.render("{{ half(age) }}", data) == "14");
|
||||
CHECK(env.render("{{ log(age) }}", data) == "");
|
||||
CHECK(env.render("{{ double-greetings }}", data) == "Hello Hello!");
|
||||
CHECK(env.render("{{ double-greetings() }}", data) == "Hello Hello!");
|
||||
CHECK(env.render("{{ multiply(4, 5) }}", data) == "20.0");
|
||||
|
||||
Reference in New Issue
Block a user