aboutsummaryrefslogtreecommitdiff
path: root/lib/prompt.lisp
diff options
context:
space:
mode:
authorColin Okay <okay@toyful.space>2022-03-11 08:35:55 -0600
committerColin Okay <okay@toyful.space>2022-03-11 08:35:55 -0600
commit08ba2769abb7a36817a725d30d64cfd36f5bcf32 (patch)
tree3068a5d9e1a4afd06a5f8b236658d4094e30dfef /lib/prompt.lisp
parent62afeb3f21d3d8e8db045a001271e686e944a049 (diff)
separated app and lib modules, -osicat dep, +packages.lisp
Diffstat (limited to 'lib/prompt.lisp')
-rw-r--r--lib/prompt.lisp30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/prompt.lisp b/lib/prompt.lisp
new file mode 100644
index 0000000..6c847f1
--- /dev/null
+++ b/lib/prompt.lisp
@@ -0,0 +1,30 @@
+;;;; prompt.lisp -- a function using readlline to collect text from the user
+
+
+
+(in-package :oneliners.cli.prompt)
+
+(defun prompt (prompt
+ &key
+ (expect (constantly t))
+ retry-text
+ (prefill ""))
+ ;; register a prefill hook
+ (rl:register-hook
+ :pre-input
+ (lambda ()
+ (rl:insert-text prefill)
+ (rl:redisplay)))
+ (unwind-protect
+ (loop
+ with prompt-text = prompt
+ with should-retry-p = t
+ while should-retry-p
+ for line = (rl:readline :prompt prompt-text)
+ when (funcall expect line)
+ do (setf should-retry-p nil)
+ when retry-text
+ do (setf prompt-text retry-text)
+ finally (return line))
+ ;; unregisters the hook.
+ (rl:register-hook :pre-input nil)))