summaryrefslogtreecommitdiffstats
path: root/iredis/processors.py
diff options
context:
space:
mode:
Diffstat (limited to 'iredis/processors.py')
-rw-r--r--iredis/processors.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/iredis/processors.py b/iredis/processors.py
new file mode 100644
index 0000000..029f80d
--- /dev/null
+++ b/iredis/processors.py
@@ -0,0 +1,79 @@
+import logging
+
+from prompt_toolkit.layout.processors import (
+ Processor,
+ Transformation,
+ TransformationInput,
+)
+
+from .exceptions import InvalidArguments, AmbiguousCommand
+from .commands import split_command_args
+
+logger = logging.getLogger(__name__)
+
+
+class UserInputCommand:
+ """
+ User inputted command in real time.
+
+ ``UpdateBottomProcessor`` update it, and ``BottomToolbar`` read it
+ """
+
+ def __init__(self):
+ # command will always be upper case
+ self.command = None
+
+
+class UpdateBottomProcessor(Processor):
+ """
+ Update Footer display text while user input.
+ """
+
+ def __init__(self, command_holder, session):
+ # processor will call for internal_refresh, when input_text didn't
+ # change, don't run
+ self.session = session
+ self.command_holder = command_holder
+
+ def apply_transformation(
+ self, transformation_input: TransformationInput
+ ) -> Transformation:
+ input_text = transformation_input.document.text
+ try:
+ command, _ = split_command_args(input_text)
+ except (InvalidArguments, AmbiguousCommand):
+ self.command_holder.command = None
+ else:
+ self.command_holder.command = command.upper()
+
+ return Transformation(transformation_input.fragments)
+
+
+class PasswordProcessor(Processor):
+ """
+ Processor that turns masks the input. (For passwords.)
+
+ :param char: (string) Character to be used. "*" by default.
+ """
+
+ def __init__(self, char: str = "*") -> None:
+ self.char = char
+
+ def apply_transformation(self, ti: TransformationInput) -> Transformation:
+ input_text = ti.document.text
+ default_transformation = Transformation(ti.fragments)
+ try:
+ command, _ = split_command_args(input_text)
+ except (InvalidArguments, AmbiguousCommand):
+ return default_transformation
+
+ if command.upper() != "AUTH":
+ return default_transformation
+
+ fragments = []
+ for style, text, *handler in ti.fragments:
+ if style == "class:password":
+ fragments.append((style, self.char * len(text), *handler))
+ else:
+ fragments.append((style, text, *handler))
+ return Transformation(fragments)