diff --git a/README.md b/README.md index 37eb362..63a313d 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,10 @@ render("{{ odd(42) }}", data); // false render("{{ even(42) }}", data); // true render("{{ divisibleBy(42, 7) }}", data); // true +// Maximum and minimum values from a list +render("{{ max([1, 2, 3]) }}", data); // 3 +render("{{ min([-2.4, -1.2, 4.5]) }}", data); // -2.4 + // Set default values if variables are not defined render("Hello {{ default(neighbour, \"my friend\") }}!"); // "Hello Peter!" render("Hello {{ default(colleague, \"my friend\") }}!"); // "Hello my friend!" diff --git a/src/inja.hpp b/src/inja.hpp index df6cc8e..cb2db34 100644 --- a/src/inja.hpp +++ b/src/inja.hpp @@ -248,6 +248,8 @@ struct Parsed { DivisibleBy, Odd, Even, + Max, + Min, ReadJson, Default, Callback @@ -396,6 +398,14 @@ public: const int number = eval_expression(element.args[0], data); return (number % 2 == 0); } + case Parsed::Function::Max: { + const std::vector list = eval_expression>(element.args[0], data); + return *std::max_element(list.begin(), list.end()); + } + case Parsed::Function::Min: { + const std::vector list = eval_expression>(element.args[0], data); + return *std::min_element(list.begin(), list.end()); + } case Parsed::Function::Not: { return not eval_expression(element.args[0], data); } @@ -601,6 +611,8 @@ public: {Parsed::Function::DivisibleBy, function_regex("divisibleBy", 2)}, {Parsed::Function::Odd, function_regex("odd", 1)}, {Parsed::Function::Even, function_regex("even", 1)}, + {Parsed::Function::Max, function_regex("max", 1)}, + {Parsed::Function::Min, function_regex("min", 1)}, {Parsed::Function::ReadJson, Regex{"\\s*([^\\(\\)]*\\S)\\s*"}}, {Parsed::Function::Default, function_regex("default", 2)} }; diff --git a/test/src/unit-renderer.cpp b/test/src/unit-renderer.cpp index 1e9f651..ef786b5 100644 --- a/test/src/unit-renderer.cpp +++ b/test/src/unit-renderer.cpp @@ -142,6 +142,18 @@ TEST_CASE("functions") { // CHECK_THROWS_WITH( env.render("{{ even(name) }}", data), "[json.exception.type_error.302] type must be number, but is string" ); } + SECTION("max") { + CHECK( env.render("{{ max([1, 2, 3]) }}", data) == "3" ); + CHECK( env.render("{{ max([-5.2, 100.2, 2.4]) }}", data) == "100.2" ); + // CHECK_THROWS_WITH( env.render("{{ even(name) }}", data), "[json.exception.type_error.302] type must be number, but is string" ); + } + + SECTION("min") { + CHECK( env.render("{{ min([1, 2, 3]) }}", data) == "1" ); + CHECK( env.render("{{ min([-5.2, 100.2, 2.4]) }}", data) == "-5.2" ); + // CHECK_THROWS_WITH( env.render("{{ even(name) }}", data), "[json.exception.type_error.302] type must be number, but is string" ); + } + SECTION("default") { CHECK( env.render("{{ default(11, 0) }}", data) == "11" ); CHECK( env.render("{{ default(nothing, 0) }}", data) == "0" );