11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
26PROMEKI_NAMESPACE_BEGIN
42 class VariantQueryNode;
45 using VariantQueryNodeUPtr = UniquePtr<VariantQueryNode>;
56 struct VariantQueryContext {
63 Function<Optional<Variant>(
const String &)> resolve;
74 Function<
const VariantSpec *(
const String &)> specFor;
90 VariantQueryNodeUPtr parseVariantQueryExpr(
const String &expr, String &errorDetail);
98 bool evalVariantQuery(
const VariantQueryNode *root,
const VariantQueryContext &ctx);
191template <
typename T>
class VariantQuery {
202 static Result<VariantQuery<T>> parse(
const String &expr);
208 VariantQuery(
const VariantQuery &) =
delete;
209 VariantQuery &operator=(
const VariantQuery &) =
delete;
210 VariantQuery(VariantQuery &&) noexcept;
211 VariantQuery &operator=(VariantQuery &&) noexcept;
214 bool isValid() const;
224 bool match(const T &instance) const;
227 const String &source() const;
235 const String &errorDetail() const;
238 VariantQuery(String source, detail::VariantQueryNodeUPtr root);
242 detail::VariantQueryNodeUPtr _root;
245extern template class VariantQuery<Frame>;