from core.builtin_concepts import BuiltinConcepts, ParserResultConcept from core.rule import Rule, ACTION_TYPE_DEFERRED from evaluators.BaseEvaluator import OneReturnValueEvaluator class RuleEvaluator(OneReturnValueEvaluator): """ This first version will only returns the rule found by the parser """ NAME = "Rule" def __init__(self): """ """ super().__init__(self.NAME, [BuiltinConcepts.EVALUATION], 50) def matches(self, context, return_value): if not return_value.status: return False if not isinstance(return_value.value, ParserResultConcept): return False value = return_value.value.value return isinstance(value, Rule) or isinstance(value, list) and len(value) > 0 and isinstance(value[0], Rule) def eval(self, context, return_value): sheerka = context.sheerka rules = return_value.value.value resolved = [] success = True for r in rules: # Browse the rules to find possible deferred rules if r.metadata.action_type == ACTION_TYPE_DEFERRED: rule_id = sheerka.get_from_short_term_memory(context, r.id) rule = sheerka.get_rule_by_id(str(rule_id or r.id)) resolved.append(rule) success &= isinstance(rule, Rule) else: resolved.append(r) return context.sheerka.ret(self.name, success, resolved if len(resolved) > 1 else resolved[0], parents=[return_value])