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
1 changed files with 48 additions and 42 deletions

View File

@ -167,6 +167,11 @@ ircd::m::push::match::match(const event &event,
// push::match condition functors (internal)
//
namespace ircd::m::push
{
static string_view value_extract(const event &, const cond &);
}
bool
ircd::m::push::event_match(const event &event,
const cond &cond,
@ -175,30 +180,11 @@ try
{
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
const globular_imatch pattern
{
@ -231,30 +217,11 @@ try
{
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
{
json::get<"value"_>(cond)
@ -604,6 +571,41 @@ ircd::m::push::unknown_condition_kind(const event &event,
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
//
@ -806,6 +808,10 @@ ircd::m::push::make_type(const mutable_buffer &buf,
};
}
//
// default ruleset
//
decltype(ircd::m::push::rules::defaults)
ircd::m::push::rules::defaults{R"(
{