From: Aleš Mrázek Date: Wed, 5 Jun 2024 14:59:11 +0000 (+0200) Subject: manager: config_store: only on real changes decorator for verifiers X-Git-Tag: v6.0.8~8^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=661c1682866e495ec4d801f2e090bfbafabb276d;p=thirdparty%2Fknot-resolver.git manager: config_store: only on real changes decorator for verifiers --- diff --git a/manager/knot_resolver_manager/config_store.py b/manager/knot_resolver_manager/config_store.py index 035196023..7c3b7ba95 100644 --- a/manager/knot_resolver_manager/config_store.py +++ b/manager/knot_resolver_manager/config_store.py @@ -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