Add rule handling

This commit is contained in:
Andre Basche 2023-05-21 02:25:43 +02:00
parent 9971fe95e2
commit c2765fe953
10 changed files with 133 additions and 10 deletions

View file

@ -1,4 +1,7 @@
from typing import Dict, Any, List
from typing import Dict, Any, List, Tuple, Callable, TYPE_CHECKING
if TYPE_CHECKING:
from pyhon.rules import HonRule
class HonParameter:
@ -9,6 +12,7 @@ class HonParameter:
self._mandatory: int = attributes.get("mandatory", 0)
self._value: str | float = ""
self._group: str = group
self._triggers: Dict[str, List[Tuple[Callable, "HonRule"]]] = {}
@property
def key(self) -> str:
@ -37,3 +41,21 @@ class HonParameter:
@property
def group(self) -> str:
return self._group
def add_trigger(self, value, func, data):
if self._value == value:
func(data)
self._triggers.setdefault(value, []).append((func, data))
def check_trigger(self, value) -> None:
if str(value) in self._triggers:
for trigger in self._triggers[str(value)]:
func, args = trigger
func(args)
@property
def triggers(self):
result = {}
for value, rules in self._triggers.items():
result[value] = {rule.param_key: rule.param_value for _, rule in rules}
return result

View file

@ -19,6 +19,10 @@ class HonParameterEnum(HonParameter):
def values(self) -> List[str]:
return [str(value) for value in self._values]
@values.setter
def values(self, values) -> None:
self._values = values
@property
def value(self) -> str | float:
return self._value if self._value is not None else self.values[0]
@ -27,5 +31,6 @@ class HonParameterEnum(HonParameter):
def value(self, value: str) -> None:
if value in self.values:
self._value = value
self.check_trigger(value)
else:
raise ValueError(f"Allowed values {self._value}")
raise ValueError(f"Allowed values {self._values}")

View file

@ -19,3 +19,4 @@ class HonParameterFixed(HonParameter):
def value(self, value: str | float) -> None:
# Fixed values seems being not so fixed as thought
self._value = value
self.check_trigger(value)

View file

@ -35,8 +35,12 @@ class HonParameterProgram(HonParameterEnum):
values = [v for v in self._programs if all(f not in v for f in self._FILTER)]
return sorted(values)
@values.setter
def values(self, values) -> None:
return
@property
def ids(self):
def ids(self) -> Dict[int, str]:
values = {
int(p.parameters["prCode"].value): n
for i, (n, p) in enumerate(self._programs.items())

View file

@ -45,6 +45,7 @@ class HonParameterRange(HonParameter):
value = str_to_float(value)
if self._min <= value <= self._max and not (value - self._min) % self._step:
self._value = value
self.check_trigger(value)
else:
raise ValueError(
f"Allowed: min {self._min} max {self._max} step {self._step}"