add default function

This commit is contained in:
pantor
2018-02-18 11:50:14 +01:00
parent be2e8fca78
commit b57a747ef2
3 changed files with 23 additions and 1 deletions
+4
View File
@@ -182,6 +182,10 @@ render("{{ round(3.1415, 3) }}", data); // 3.142
render("{{ odd(42) }}", data); // false
render("{{ even(42) }}", data); // true
render("{{ divisibleBy(42, 7) }}", data); // true
// 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!"
```
### Callbacks
+10 -1
View File
@@ -250,6 +250,7 @@ struct Parsed {
Odd,
Even,
ReadJson,
Default,
Callback
};
@@ -443,6 +444,13 @@ public:
if (result.is_null()) { throw std::runtime_error("Did not found json element: " + element.command); }
return result;
}
case Parsed::Function::Default: {
try {
return eval_expression(element.args[0], data);
} catch (std::exception e) {
return eval_expression(element.args[1], data);
}
}
case Parsed::Function::Callback: {
return map_callbacks[element.command](element.args, data);
}
@@ -575,7 +583,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::ReadJson, Regex{"\\s*([^\\(\\)]*\\S)\\s*"}}
{Parsed::Function::ReadJson, Regex{"\\s*([^\\(\\)]*\\S)\\s*"}},
{Parsed::Function::Default, function_regex("default", 2)}
};
std::map<std::string, Regex> regex_map_callbacks;
+9
View File
@@ -133,6 +133,15 @@ TEST_CASE("functions") {
CHECK( env.render("{{ even(12) }}", data) == "true" );
// 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" );
CHECK( env.render("{{ default(name, \"nobody\") }}", data) == "Peter" );
CHECK( env.render("{{ default(surname, \"nobody\") }}", data) == "nobody" );
CHECK_THROWS_WITH( env.render("{{ default(surname, lastname) }}", data), "Did not found json element: lastname" );
}
}
TEST_CASE("callbacks") {