38 lines
No EOL
1.4 KiB
Python
38 lines
No EOL
1.4 KiB
Python
import functools
|
|
from typing import List, Callable, Generator
|
|
|
|
from api.od import ODAPI
|
|
from .exec_node import ExecNode
|
|
from .data_node import DataNode
|
|
from ..RuleExecuter import RuleExecuter
|
|
|
|
|
|
class Rewrite(ExecNode, DataNode):
|
|
def __init__(self, label: str) -> None:
|
|
ExecNode.__init__(self, out_connections=1)
|
|
DataNode.__init__(self)
|
|
self.label = label
|
|
self.rule = None
|
|
self.rule_executer : RuleExecuter
|
|
|
|
def init_rule(self, rule, rule_executer):
|
|
self.rule = rule
|
|
self.rule_executer= rule_executer
|
|
|
|
def execute(self, od: ODAPI) -> Generator | None:
|
|
yield "ghello", functools.partial(self.rewrite, od)
|
|
|
|
def rewrite(self, od):
|
|
print("rewrite" + self.label)
|
|
pivot = {}
|
|
if self.data_in is not None:
|
|
pivot = self.get_input_data()[0]
|
|
self.store_data(self.rule_executer.rewrite_rule(od.m, self.rule, pivot=pivot), 1)
|
|
return ODAPI(od.state, od.m, od.mm),[f"rewrite {self.label}\n\tpivot: {pivot}\n\t{"success" if self.data_out.success else "failure"}\n"]
|
|
|
|
def generate_dot(self, nodes: List[str], edges: List[str], visited: set[int]) -> None:
|
|
if self.id in visited:
|
|
return
|
|
nodes.append(f"{self.id}[label=R_{self.label.split("/")[-1]}]")
|
|
ExecNode.generate_dot(self, nodes, edges, visited)
|
|
DataNode.generate_dot(self, nodes, edges, visited) |