#pragma once #include "Rule.hpp" #include #include #include #include #include namespace Desktop::Rule { template class CRuleWithEffects : public IRule { public: using effectType = TEffect; using storageType = TEffect::storageType; using valueType = TEffect::valueType; eRuleType type() override { return RULE_TYPE; } std::expected addEffect(storageType e, const std::string& result) { auto parsed = parseEffect(e, result); if (!parsed) return std::unexpected(parsed.error()); m_effects.emplace_back(TEffect{.key = e, .raw = result, .value = std::move(*parsed)}); m_effectSet.emplace(e); return {}; } const std::vector& effects() { return m_effects; } const std::unordered_set& effectsSet() { return m_effectSet; } protected: CRuleWithEffects(const std::string& name = "") : IRule(name) {} virtual std::expected parseEffect(storageType e, const std::string& result) = 0; std::expected addParsedEffect(storageType e, valueType value, std::string raw = {}) { m_effects.emplace_back(TEffect{.key = e, .raw = std::move(raw), .value = std::move(value)}); m_effectSet.emplace(e); return {}; } private: std::vector m_effects; std::unordered_set m_effectSet; }; }