aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar MarkKoz <[email protected]>2020-07-18 12:29:40 -0700
committerGravatar MarkKoz <[email protected]>2020-07-31 23:01:26 -0700
commit8620e5541b89fb42b396dde0dbc5439de103417a (patch)
treef35aaf14d9d3d52c5a037396bec07fe4df127b3e
parentReminders: make operations mutually exclusive (diff)
Add a function to wrap a decorator to use get_arg_value
-rw-r--r--bot/utils/function.py29
1 files changed, 28 insertions, 1 deletions
diff --git a/bot/utils/function.py b/bot/utils/function.py
index 7c5949122..23188e79e 100644
--- a/bot/utils/function.py
+++ b/bot/utils/function.py
@@ -3,9 +3,12 @@
import typing as t
Argument = t.Union[int, str]
+BoundArgs = t.OrderedDict[str, t.Any]
+Decorator = t.Callable[[t.Callable], t.Callable]
+ArgValGetter = t.Callable[[BoundArgs], t.Any]
-def get_arg_value(name_or_pos: Argument, arguments: t.OrderedDict[str, t.Any]) -> t.Any:
+def get_arg_value(name_or_pos: Argument, arguments: BoundArgs) -> t.Any:
"""
Return a value from `arguments` based on a name or position.
@@ -32,3 +35,27 @@ def get_arg_value(name_or_pos: Argument, arguments: t.OrderedDict[str, t.Any]) -
raise ValueError(f"Argument {arg_name!r} doesn't exist.")
else:
raise TypeError("'arg' must either be an int (positional index) or a str (keyword).")
+
+
+def get_arg_value_wrapper(
+ decorator_func: t.Callable[[ArgValGetter], Decorator],
+ name_or_pos: Argument,
+ func: t.Callable[[t.Any], t.Any] = None,
+) -> Decorator:
+ """
+ Call `decorator_func` with the value of the arg at the given name/position.
+
+ `decorator_func` must accept a callable as a parameter to which it will pass a mapping of
+ parameter names to argument values of the function it's decorating.
+
+ `func` is an optional callable which will return a new value given the argument's value.
+
+ Return the decorator returned by `decorator_func`.
+ """
+ def wrapper(args: BoundArgs) -> t.Any:
+ value = get_arg_value(name_or_pos, args)
+ if func:
+ value = func(value)
+ return value
+
+ return decorator_func(wrapper)