diff --git a/src/platform/Ligare/platform/feature_flag/__init__.py b/src/platform/Ligare/platform/feature_flag/__init__.py index 3e8ec3d2..e464c8dc 100644 --- a/src/platform/Ligare/platform/feature_flag/__init__.py +++ b/src/platform/Ligare/platform/feature_flag/__init__.py @@ -2,6 +2,7 @@ from .caching_feature_flag_router import FeatureFlag as CacheFeatureFlag from .db_feature_flag_router import DBFeatureFlagRouter from .db_feature_flag_router import FeatureFlag as DBFeatureFlag +from .decorators import feature_flag from .feature_flag_router import FeatureFlag, FeatureFlagChange, FeatureFlagRouter __all__ = ( @@ -12,4 +13,5 @@ "CacheFeatureFlag", "DBFeatureFlag", "FeatureFlagChange", + "feature_flag", ) diff --git a/src/platform/Ligare/platform/feature_flag/decorators.py b/src/platform/Ligare/platform/feature_flag/decorators.py new file mode 100644 index 00000000..9c86292f --- /dev/null +++ b/src/platform/Ligare/platform/feature_flag/decorators.py @@ -0,0 +1,40 @@ +from typing import Any, Callable + +from injector import Injector, inject +from typing_extensions import overload + +from .feature_flag_router import FeatureFlag, FeatureFlagRouter + + +@overload +def feature_flag( + feature_flag_name: str, *, enabled_callback: Callable[..., Any] +) -> Callable[..., Callable[..., Any]]: ... +@overload +def feature_flag( + feature_flag_name: str, *, disabled_callback: Callable[..., Any] +) -> Callable[..., Callable[..., Any]]: ... + + +def feature_flag( + feature_flag_name: str, + *, + enabled_callback: Callable[..., None] = lambda: None, + disabled_callback: Callable[..., None] = lambda: None, +) -> Callable[..., Callable[..., Any]]: + def decorator(fn: Callable[..., Any]): + @inject + def wrapper( + feature_flag_router: FeatureFlagRouter[FeatureFlag], + injector: Injector, + ): + if feature_flag_router.feature_is_enabled(feature_flag_name): + enabled_callback() + else: + disabled_callback() + + return injector.call_with_injection(fn) + + return wrapper + + return decorator