Skip to content

Commit 842cde7

Browse files
committed
feat: Builder now creates new types of iterables with iterable()
The iterables should now be preferred to have parantheses and not square brackets.
1 parent 50070b0 commit 842cde7

File tree

3 files changed

+41
-6
lines changed

3 files changed

+41
-6
lines changed

src/builder/yara_expression_builder.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,19 +1271,19 @@ YaraExpressionBuilder ofAt(const YaraExpressionBuilder& quantifier, const YaraEx
12711271
YaraExpressionBuilder iterable(const std::vector<YaraExpressionBuilder>& elements)
12721272
{
12731273
auto ts = std::make_shared<TokenStream>();
1274-
TokenIt lsqb = ts->emplace_back(TokenType::LSQB_ENUMERATION, "[");
1274+
TokenIt lb = ts->emplace_back(TokenType::LP_ENUMERATION, "(");
12751275
for (std::size_t i = 0; i < elements.size(); ++i)
12761276
{
12771277
ts->moveAppend(elements[i].getTokenStream());
12781278
if (i < elements.size() - 1)
12791279
ts->emplace_back(TokenType::COMMA, ",");
12801280
}
1281-
TokenIt rsqb = ts->emplace_back(TokenType::RSQB_ENUMERATION, "]");
1281+
TokenIt rb = ts->emplace_back(TokenType::RP_ENUMERATION, ")");
12821282

12831283
std::vector<Expression::Ptr> elementsExprs;
12841284
std::for_each(elements.begin(), elements.end(), [&elementsExprs](const YaraExpressionBuilder& expr) { elementsExprs.push_back(expr.get()); });
12851285

1286-
auto expression = std::make_shared<IterableExpression>(lsqb, std::move(elementsExprs), rsqb);
1286+
auto expression = std::make_shared<IterableExpression>(lb, std::move(elementsExprs), rb);
12871287
return YaraExpressionBuilder(std::move(ts), std::move(expression));
12881288
}
12891289

tests/cpp/builder_tests.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2413,5 +2413,40 @@ WithWorks) {
24132413
)", yaraFile->getTextFormatted());
24142414
}
24152415

2416+
TEST_F(BuilderTests,
2417+
IterableWorks) {
2418+
auto cond = of(
2419+
any(),
2420+
iterable({
2421+
intVal(1),
2422+
intVal(2)
2423+
})
2424+
).get();
2425+
2426+
YaraRuleBuilder newRule;
2427+
auto rule = newRule
2428+
.withName("iterable_builder")
2429+
.withCondition(cond)
2430+
.get();
2431+
2432+
YaraFileBuilder newFile;
2433+
auto yaraFile = newFile
2434+
.withRule(std::move(rule))
2435+
.get(true);
2436+
2437+
ASSERT_NE(nullptr, yaraFile);
2438+
EXPECT_EQ(R"(rule iterable_builder {
2439+
condition:
2440+
any of (1, 2)
2441+
})", yaraFile->getText());
2442+
2443+
EXPECT_EQ(R"(rule iterable_builder
2444+
{
2445+
condition:
2446+
any of (1, 2)
2447+
}
2448+
)", yaraFile->getTextFormatted());
2449+
}
2450+
24162451
}
24172452
}

tests/cpp/visitor_tests.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,7 @@ rule rule_name {
816816
variables:
817817
var = 1.5
818818
condition:
819-
(true and all of ["string"=="strong" and var<3.0, true, time.now() < 1000]) or false
819+
(true and all of ("string"=="strong" and var<3.0, true, time.now() < 1000)) or false
820820
}
821821
)");
822822
EXPECT_TRUE(driver.parse(input));
@@ -828,7 +828,7 @@ rule rule_name {
828828
visitor.process_rule(rule);
829829

830830
EXPECT_EQ("rule_name", rule->getName());
831-
EXPECT_EQ("(true and all of [var > 5.5, time.now() > 500]) or false", rule->getCondition()->getText());
831+
EXPECT_EQ("(true and all of (var > 5.5, time.now() > 500)) or false", rule->getCondition()->getText());
832832

833833
std::string expected = R"(import "time"
834834
@@ -839,7 +839,7 @@ rule rule_name
839839
condition:
840840
(
841841
true and
842-
all of [ var > 5.5, time.now() > 500 ]
842+
all of (var > 5.5, time.now() > 500)
843843
) or
844844
false
845845
}

0 commit comments

Comments
 (0)