diff --git a/src/python/yaramod_python.cpp b/src/python/yaramod_python.cpp index e3a8a76d..9d8b9482 100644 --- a/src/python/yaramod_python.cpp +++ b/src/python/yaramod_python.cpp @@ -306,7 +306,13 @@ void addBasicClasses(py::module& module) py::class_(module, "Meta") .def_property("key", &Meta::getKey, &Meta::setKey) - .def_property("value", &Meta::getValue, &Meta::setValue); + .def_property("value", &Meta::getValue, &Meta::setValue) + .def_property_readonly("token_key", [](Meta& self) { + return *self.getKeyTokenIt(); + }) + .def_property_readonly("token_value", [](Meta& self) { + return *self.getValueTokenIt(); + }); py::class_(module, "Variable") .def_property("key", &Variable::getKey, &Variable::setKey) diff --git a/tests/python/test_representation.py b/tests/python/test_representation.py index e9e3a2f6..2d30d149 100644 --- a/tests/python/test_representation.py +++ b/tests/python/test_representation.py @@ -151,3 +151,46 @@ def test_get_tokenstream_after_unknown_module_error(self): '\n', 'rule' ]) + + def test_meta_values_interface(self): + input_text = """rule test { + meta: + author = "Name Surname" + description = "Test checking the meta value tokens" + condition: + false +} +""" + ymod = yaramod.Yaramod() + yfile = ymod.parse_string(input_text) + self.assertEqual(len(yfile.rules[0].metas), 2) + + meta = yfile.rules[0].metas[0] # author + self.assertTrue(hasattr(meta, "token_key")) + token = meta.token_key + self.assertEqual(token.location.begin.line, 3) + self.assertEqual(token.location.begin.column, 9) + self.assertEqual(token.location.end.line, 3) + self.assertEqual(token.location.end.column, 14) + + self.assertTrue(hasattr(meta, "token_value")) + token = meta.token_value + self.assertEqual(token.location.begin.line, 3) + self.assertEqual(token.location.begin.column, 18) + self.assertEqual(token.location.end.line, 3) + self.assertEqual(token.location.end.column, 31) + + meta = yfile.rules[0].metas[1] # description + self.assertTrue(hasattr(meta, "token_key")) + token = meta.token_key + self.assertEqual(token.location.begin.line, 4) + self.assertEqual(token.location.begin.column, 9) + self.assertEqual(token.location.end.line, 4) + self.assertEqual(token.location.end.column, 19) + + self.assertTrue(hasattr(meta, "token_value")) + token = meta.token_value + self.assertEqual(token.location.begin.line, 4) + self.assertEqual(token.location.begin.column, 23) + self.assertEqual(token.location.end.line, 4) + self.assertEqual(token.location.end.column, 59)