]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
manager: config_store: only on real changes decorator for verifiers
authorAleš Mrázek <ales.mrazek@nic.cz>
Wed, 5 Jun 2024 14:59:11 +0000 (16:59 +0200)
committerAleš Mrázek <ales.mrazek@nic.cz>
Tue, 2 Jul 2024 12:07:48 +0000 (14:07 +0200)
manager/knot_resolver_manager/config_store.py

index 035196023a2ad4e6b223e5949dd273a8d5aa8157..7c3b7ba950d490864b1d31a7d991076852e2f019 100644 (file)
@@ -6,6 +6,7 @@ from knot_resolver_manager.datamodel import KresConfig
 from knot_resolver_manager.exceptions import KresManagerException
 from knot_resolver_manager.utils.functional import Result
 from knot_resolver_manager.utils.modeling.exceptions import DataParsingError
+from knot_resolver_manager.utils.modeling.types import NoneType
 
 VerifyCallback = Callable[[KresConfig, KresConfig], Awaitable[Result[None, str]]]
 UpdateCallback = Callable[[KresConfig], Awaitable[None]]
@@ -75,3 +76,25 @@ def only_on_real_changes(selector: Callable[[KresConfig], Any]) -> Callable[[Upd
         return new_func
 
     return decorator
+
+
+def only_on_real_changes_verifier(selector: Callable[[KresConfig], Any]) -> Callable[[VerifyCallback], VerifyCallback]:
+    def decorator(orig_func: VerifyCallback) -> VerifyCallback:
+        original_value_set: Any = False
+        original_value: Any = None
+
+        async def new_func_verifier(old: KresConfig, new: KresConfig) -> Result[NoneType, str]:
+            nonlocal original_value_set
+            nonlocal original_value
+            if not original_value_set:
+                original_value_set = True
+                original_value = selector(new)
+                await orig_func(old, new)
+            elif original_value != selector(new):
+                original_value = selector(new)
+                await orig_func(old, new)
+            return Result.ok(None)
+
+        return new_func_verifier
+
+    return decorator