]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
manager: config_store: added only_on_no_changes_update decorator
authorAleš Mrázek <ales.mrazek@nic.cz>
Fri, 27 Dec 2024 15:05:51 +0000 (16:05 +0100)
committerAleš Mrázek <ales.mrazek@nic.cz>
Tue, 14 Jan 2025 08:48:01 +0000 (09:48 +0100)
This decorator will only trigger the function if the selected config has not been changed.

python/knot_resolver/manager/config_store.py

index 214062b2b4bb453be9ab18273cacd19b3d8b81f4..70a9d942e4e73430199070e19f194625dcb9a139 100644 (file)
@@ -59,6 +59,25 @@ class ConfigStore:
         return self._config
 
 
+def only_on_no_changes_update(selector: Callable[[KresConfig], Any]) -> Callable[[UpdateCallback], UpdateCallback]:
+    def decorator(orig_func: UpdateCallback) -> UpdateCallback:
+        original_value_set: Any = False
+        original_value: Any = None
+
+        async def new_func_update(config: KresConfig) -> None:
+            nonlocal original_value_set
+            nonlocal original_value
+            if not original_value_set:
+                original_value_set = True
+            elif original_value == selector(config):
+                await orig_func(config)
+            original_value = selector(config)
+
+        return new_func_update
+
+    return decorator
+
+
 def only_on_real_changes_update(selector: Callable[[KresConfig], Any]) -> Callable[[UpdateCallback], UpdateCallback]:
     def decorator(orig_func: UpdateCallback) -> UpdateCallback:
         original_value_set: Any = False