0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-08 04:58:58 +02:00

ircd:Ⓜ️:push: Deduplicate abstract dot-path value extraction for event conditions.

This commit is contained in:
Jason Volk 2023-03-07 10:22:58 -08:00
parent ae10f735ec
commit 0c20fa69d9

View file

@ -167,6 +167,11 @@ ircd::m::push::match::match(const event &event,
// push::match condition functors (internal) // push::match condition functors (internal)
// //
namespace ircd::m::push
{
static string_view value_extract(const event &, const cond &);
}
bool bool
ircd::m::push::event_match(const event &event, ircd::m::push::event_match(const event &event,
const cond &cond, const cond &cond,
@ -175,30 +180,11 @@ try
{ {
assert(json::get<"kind"_>(cond) == "event_match"); assert(json::get<"kind"_>(cond) == "event_match");
const auto &[top, path] const auto value
{ {
split(json::get<"key"_>(cond), '.') value_extract(event, cond)
}; };
string_view value
{
json::get(event, top, json::object{})
};
tokens(path, '.', [&value]
(const string_view &key)
{
if(!json::type(value, json::OBJECT))
return false;
value = json::object(value)[key];
if(likely(!json::type(value, json::STRING)))
return true;
value = json::string(value);
return false;
});
//TODO: XXX spec leading/trailing; not imatch //TODO: XXX spec leading/trailing; not imatch
const globular_imatch pattern const globular_imatch pattern
{ {
@ -231,30 +217,11 @@ try
{ {
assert(json::get<"kind"_>(cond) == "event_property_is"); assert(json::get<"kind"_>(cond) == "event_property_is");
const auto &[top, path] const auto value
{ {
split(json::get<"key"_>(cond), '.') value_extract(event, cond)
}; };
string_view value
{
json::get(event, top, json::object{})
};
tokens(path, '.', [&value]
(const string_view &key)
{
if(!json::type(value, json::OBJECT))
return false;
value = json::object(value)[key];
if(likely(!json::type(value, json::STRING)))
return true;
value = json::string(value);
return false;
});
const json::value a{value}, b const json::value a{value}, b
{ {
json::get<"value"_>(cond) json::get<"value"_>(cond)
@ -604,6 +571,41 @@ ircd::m::push::unknown_condition_kind(const event &event,
return false; return false;
} }
//
// match tools (internal)
//
ircd::string_view
ircd::m::push::value_extract(const event &event,
const cond &cond)
{
const auto &[top, path]
{
split(json::get<"key"_>(cond), '.')
};
string_view value
{
json::get(event, top, json::object{})
};
tokens(path, '.', [&value]
(const string_view &key)
{
if(!json::type(value, json::OBJECT))
return false;
value = json::object(value)[key];
if(likely(!json::type(value, json::STRING)))
return true;
value = json::string(value);
return false;
});
return value;
}
// //
// rule // rule
// //
@ -806,6 +808,10 @@ ircd::m::push::make_type(const mutable_buffer &buf,
}; };
} }
//
// default ruleset
//
decltype(ircd::m::push::rules::defaults) decltype(ircd::m::push::rules::defaults)
ircd::m::push::rules::defaults{R"( ircd::m::push::rules::defaults{R"(
{ {