From 18e44a06ddf3a379159afcaf14dd96800b54ebf2 Mon Sep 17 00:00:00 2001 From: Colin Okay Date: Sun, 6 Mar 2022 11:34:25 -0600 Subject: moved prompt into its own package --- src/prompt.lisp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/prompt.lisp (limited to 'src/prompt.lisp') diff --git a/src/prompt.lisp b/src/prompt.lisp new file mode 100644 index 0000000..afe8604 --- /dev/null +++ b/src/prompt.lisp @@ -0,0 +1,33 @@ +;;;; prompt.lisp -- a function using readlline to collect text from the user + +(defpackage #:oneliners.cli.prompt + (:use #:cl) + (:local-nicknames (#:rl #:cl-readline)) + (:export #:prompt)) + +(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))) -- cgit v1.2.3