min, max functions

This commit is contained in:
pantor
2018-02-18 19:34:16 +01:00
parent c886c89131
commit 37d16d3c3a
3 changed files with 28 additions and 0 deletions

View File

@@ -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!"

View File

@@ -248,6 +248,8 @@ struct Parsed {
DivisibleBy,
Odd,
Even,
Max,
Min,
ReadJson,
Default,
Callback
@@ -396,6 +398,14 @@ public:
const int number = eval_expression<int>(element.args[0], data);
return (number % 2 == 0);
}
case Parsed::Function::Max: {
const std::vector<json> list = eval_expression<std::vector<json>>(element.args[0], data);
return *std::max_element(list.begin(), list.end());
}
case Parsed::Function::Min: {
const std::vector<json> list = eval_expression<std::vector<json>>(element.args[0], data);
return *std::min_element(list.begin(), list.end());
}
case Parsed::Function::Not: {
return not eval_expression<bool>(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)}
};

View File

@@ -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" );