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:
parent
ae10f735ec
commit
0c20fa69d9
|
@ -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"(
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue