48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
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])
|